-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
读书笔记-javascript 高级程序设计 #1
Comments
toString 和 toLocaleString() 的区别
总结:该字符串与执行环境的地区对应 ps: 欢迎大家添加讨论 |
一元运算符
|
位操作符-按位非
|
布尔操作符
|
null, undefined 用Number() 转换
|
关系操作符
|
for-in 语句
|
break & continue 语句
|
switch 语句
|
函数参数
|
检测类型
|
var obj = {"a":"aaa","1":"111","u":undefined,"b":"bbb","2":"222","n":null};
for(var key in obj){console.log('key: %o value: %o',key,obj[key])};
// output
//key: "1" value: "111"
//key: "2" value: "222"
//key: "a" value: "aaa"
//key: "u" value: undefined
//key: "b" value: "bbb"
//key: "n" value: null |
然后,你可以看下2010的这个测试数据 |
基本类型和引用类型的值
|
值传递和引用传递
如果引用类型是按引用传递的话,那么 |
执行环境和栈 这篇文章我将会深入地讨论JavaScript中最根本的一部分——Execution Context(执行上下文)。在文章结束的时候,你应该对解释器的工作原理有一个比较清晰的理解,对于为什么会存在‘变量提升’,它们的值又是如何被真正确定的这些问题有一个正确的答案。 什么是Executin Context(执行上下文) 全局 code(Global code)——代码第一次执行的默认环境 image 这里没有什么特别的地方,我们有一个global context被紫色的框框着,还有三个不同的function context,分别被绿色、蓝色、橘色的框框着。在你的程序中,有且仅能有一个global context,并且它能够被任何其他的context访问到。你能够拥有任意多个function context,并且每个函数被调用的时候都会生成一个新的context。它会生成一个私有作用域,并且在它内部声明的任何东西都不能直接在它的外部访问。就像上面的例子,一个函数可以直接访问它外面的变量,但是外部的context就不能直接访问在内部声明的变量或者函数。为什么会这样?如何准确的理解这段代码的执行? 以上是文章摘要 阅读更多请点击——>右下角的more 以下是余下全文 Execution Context Stack(执行上下文栈) 我们已经知道,当浏览器第一次加载你的script的时候,默认进入global execution context。如果,你在全局代码中调用了函数,程序序列流就会进入被调用的函数中,生成一个新的execution context并且把它压入execution stack的顶部。 (function foo(i) { 函数foo递归调用了3次,每次 i 增长1。函数 foo 每次调用后,都出生成一个新的execution context。当一个context执行完成后,它就会出栈并且把控制权返回给下面的context,直到再次到达global context。 关于execution stack有5个关键点需要记住: 这里是解释器执行代码的一个伪综述: 找到调用函数的代码。 function foo(i) { fooExecutionContext = { fooExecutionContext = { (function() { 在foo声明之前,为什么我们可以访问它? |
作用域链:
|
javascript 内存管理
|
Array 类型
|
|
RegExp 类型
-元字符不要转义
|
Function 类型
|
单体内置对象 - Global对象
|
单体内置对象- Math对象
|
结束语言:1~5 章终于结束了,下一篇章要开始了 |
一、JavaScript 简介
JavaScript 诞生于 1995年,是一种专为与网页交互而设计的脚本语言。由三种不同部分组成:
1.1 ECMScript
ECMScript 是这本语言的基础,规定了这门语言的下列组成部分:
1.2 文档对象模型(DOM)
文档对象模型(DOM, Document Object Model) 是针对XML但经过扩展用于HTML的应用程序编程接口。提供了以下方法和接口的定义:
1.3 浏览器对象模型(BOM)
浏览器对象模型(BOM, Browser Object Model) 用来访问和操作浏览器窗口,有以下的扩展:
二、在 HTML 中使用 JavaScript
2.1 内嵌脚本
在 HTML 内部直接写入
<script>
片断,这种写法要注意JavaScript 是单线程的,如果在初始化页面的时候,你的代码中存在大量同步运行的代码,导致 JS 线程一直处于繁忙状态,这时候用户在页面上进行交互时将不会得到任何反应,就像是卡死了一样。想了解具体原因,参考文章浏览器渲染原理2.2 引入外部脚本
三、基本概念
3.1 变量
ESCAScript 的变量是 松散类型 的,就是说可以用来保存任何类型的数据。也就是说一个变量就是一个占位符。
定义变量可以使用 var 操作符,定义多个变量,每个变量之间用 逗号 分开,如果 省略 var 操作符可以定义 全局变量,未经初始化的变量,会保存一个特殊的值—— undefined
在 ESCScript 中变量会被自动 提升
3.2 数据类型
ECMAScript 有6种数据类型,其中5种基本的数据类型: Undefined、Null、Boolean、Number和String,还有1种复杂的数据类型: Object。一般使用 typeof 检查5种基本的数据类型,使用 instanceof 检查是哪种复杂的数据类型。
typeof
常见的就不说了,说几个可能容易混或者错的。
Boolean 类型
Boolean 类型是 ECMAScript 中使用最多的一种类型,只有两个字面量值: true、false;区分大小写,也就是说 True 不是布尔值。
流程控制语句(例如 if 语句)自动执行 转型函数 Boolean()。
下表给出了几种数据类型及其对应的转换规则
Number 类型
String 类型
转换为字符串有两种方式 toString([几进制]) 和 String(名)
Object 类型
访问对象的属性有两种方式
3.3 操作符
布尔操作符
逻辑非和逻辑或都是 短路 操作符
逻辑与
如果第一个操作数是对象,则返回 第二个 操作数;
如果第二个操作符是对象,则只有第一个操作数的求值结果是 true 的情况下才会返回该 对象;
逻辑与
如果第一个操作数是对象,则返回 第一个 操作数;
如果两个操作数都是对象,则返回 第一个 操作数;
关系操作符
如果两个操作数都是字符串,则比较两个字符串对应的 字符编码,所以字符串比较的时候一般都转换为大写(或者小写);
任何操作数与 NaN 进行比较,结果都是 false;
3.4 语句
for 语句
在 ECMAScript 中没有块级作用域的概念,因此循环内部定义的变量也可以在外部访问到。
其实以上的代码就相当于
for-in 语句
for-in 语句用来遍历对象的属性,但此时的对象不能是null或者undefined。
switch 语句
switch 语句在比较值的时候使用的是全等
看一个我觉得很新颖的语句
函数
可以向 ECMAScript 函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数。即便你定义的函数只接收两个参数,在调用这个函数也未必一定传递两个参数,可以传递一个、三个甚至不传递参数。如果没传递值的命名参数将自动被赋予undefined值。
四、变量、作用域和内存问题
4.1 变量
ECMAScript 变量包含两种不同类型的值:基本类型和引用类型值。
基本类型的值
基本类型的值在内存中占据固定大小的空间,因此保存在 栈 内存中
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把值复制到新变量的位置上。
传递参数的时候是按 值 传递的,和复制变量一样。
引用类型
引用类型的值是对象,保存在 堆 内存中;
从一个变量向另一个变量复制引用类型的值时,同样也将存储在变量对象中的值复制一份到新分配的空间中。不同的是,这个值的副本实际上时一个指针。
但是当为对象添加属性的时候,操作的是实际对象。
传递参数的时候是按 值 传递的,和引用类型复制一样。
4.2 执行环境和作用域
4.3 内存管理
优化内存占用的最佳方式,就是为代码只保存必要的数据。一旦数据不再用了,最好通过将其值设置为 null 来释放引用。
五、引用类型
在 ECMAScript中,引用类型是一种数据结构,常用的有:Object、Date、RegExp、Function、基本包装类型、单体内置对象。
5.1 Array 类型
插入
arr[length] = 'add data from bottom';
arr.push('add data from bottom');
arr.unshift('add data from head');
splice(2,0,'red','green');
,三个参数,第一个是位置,第二个是要删除的数据个数,第三个数据为插入的数据;删除
arr[length] = arr.length - 1;
arr.pop();
arr.shift();
arr.splice(0,1);
,两个参数,第一个参数是位置,第二个参数是要删除的个数;替换
arr.splice(2,1,'red')
检测数组
检测是否是数组
转换为字符串的方法
排序方法
合并
位置方法
迭代
10.归并数组
- reduce
- reduceRight
5.1 Function 类型
函数分为函数声明和函数表达式,函数表达式可以随时访问,因为函数声明提升。
arguments 对象
arguments 对象主要用途是保存函数参数,包含一个特殊属性callee属性,是个指针,指向拥有这个arguments对象的函数;
this 对象
this 引用的是函数执行环境对象
每个函数都包含两个方法:call() 和 apply()。这两个方法的用途都是在特定的作用域中调用函数,实际上就是设置函数体内this的值。
apply(运行函数的作用域, 参数数组)
call(运行函数的作用域,其余参数)
5.1 String 类型
The text was updated successfully, but these errors were encountered: