大纲
弱类型的特性,隐式转化逻辑
1  | 32+32 //64  | 
六种数据类型
    原始类型(number string boolean nulll undefined)没有属性和方法
            +
    对象 object(Date Array Function ...)
严格等于( ===)
    1、类型不同,返回false
    2、类型相同
等于( == )
    1、类型相同,同 ===
    2、类型不同,尝试类型转化和比较
1  | null ==undefined -> true  | 
包装对象
1  | var a = "string";  | 
类型检测
1  | typeof //最常见的 适合是不是函数对象和基本类型的判断  | 
任何一个构造函数都会有一个prototype对象属性,这个对象属性将用作new来构造出对象的原型,会维持一个原型链(Obj.proto
1  | Object.prototype.toString.apply([]); === "[object Array]";  | 
其它 constructor 、 duck type
JavaScript表达式与运算符
表达式是一种JS短语,可使JS解释器用来产生一个值
运算符
逗号运算符
它会从左到右依次去计算表达式的值最后取最右边的
1  | var val = (1,2,3); //val = 3  | 
delete 运算符
删除对象上的属性
1  | var obj = {x:1};  | 
in 运算符
1  | obj.x = 1;  | 
new 运算符
1  | function Foo(){}  | 
this 运算符
1  | this; // window(浏览器)  | 
void 一元运算符void 0 //undefined void(0) //undefined
运算符优先级
| 运算符 | 描述 | 
|---|---|
. [] () | 
字段访问、数组下标、函数调用以及表达式分组 | 
++ -- - ~ ! delete new typeof void | 
一元运算符、返回数据类型、对象创建、未定义值 | 
* / % | 
乘法、除法、取模 | 
<< >> >>> | 
移位 | 
== != === !== | 
等于、不等于、严格相等、非严格相等 | 
& | 
按位与 | 
^ | 
按位异或 | 
丨 | 
按位或 | 
&& | 
逻辑与 | 
丨丨 | 
逻辑或 | 
?: | 
条件运算符 | 
= oP= | 
赋值 | 
, | 
逗号 | 
语句
block语句、var语句
block 语句
块语句常用于组合0 ~ 多个语句。块语句用一对花括号定义。
没有块级的作用域,Java等很多语言都是有块级作用域的
1  | for(var i =0;i<10;i++){}  | 
但是JS有全局作用域、函数作用域等作用域
var 语句var a = b = 1 //这样写本身不会错,但是写在函数里面那么b将会是一个全局变量
try-catch
三种表示形式(和Java一样)
1  | try{}catch(e){}  | 
函数、switch、循环
1  | function fd(){} //函数声明  | 
for…in
1  | for(var i in [1,2,3]){}  | 
坑:
- 顺序不确定(依赖引擎实现)
 - enumerable 为false时不会出现
 - for in 对象属性时受到原型链影响
 
with <已经不建议使用了>
可以修改当前的作用域
1  | with({x:1}){  | 
严格模式
严格模式是一种特殊的执行模式,它修复了部分语言上的不足,提供更强的错误检查,并增强安全性。是向上兼容的。
1  | function func(){  | 
- 严格模式下不允许使用with
 - 不允许为声明的变量被赋值
 - arguments变为参数的静态副本(与形参没有相互的绑定关系了,但是参数是对象去修改参数属性的话依旧会影响
arguments[0].x = 100;) - delete参数报错
 - 对象字面量重复属性名报错
 - 禁止八进制字面量
 - eval,arguments变为关键字,不能作为变量、函数名
 - eval变为独立作用域
 
对象
对象中包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。每个对象还有一个原型,会有一个 [[ proto ]] 对象属性。还有[[class]]、[[extensible]]
对象中每一个属性都有很多标签(writeable、enumerable、configurable、value、get/set)
创建对象
1  | var o = new Object;  | 
通过 Object.create 创建对象
1  | var obj = Object.create({x:!});  | 
属性操作
1  | var obj = {x:1,y:2};  | 
需注意的是我们用对象自变量,new Obejct 去创建的对象,或者是通过赋值去创建这样的属性默认既可以枚举也可以写也可以delete,都是true的,而通过defineProperty这种方式创建的话默认都是false。
1  | var cat = new Obejct;  | 
属性的枚举
1  | var o = {x : 1,y : 2};  | 
get/set方法
1  | var man = {  | 
属性标签
1  | Object.getOwnPropertyDescriptor({pro:true},'pro');  | 
| / | configurable:true, writable:true | 
configurable:true, writable:false | 
configurable:false, writable:true | 
configurable:false, writable:false | 
|---|---|---|---|---|
| 修改属性的值 | ✔ | ✔ 重设value标签修改 | ✔ | X | 
| 通过属性赋值修改属性值 | ✔ | X | ✔ | X | 
| delete 返回 true | ✔ | ✔ | X | X | 
| 修改getter/setter方法 | ✔ | ✔ | X | X | 
| 修改属性标签 (writable从true改为false总是运许) | ✔ | ✔ | X | X | 
对象标签、对象序列化
[[proto]]
[[class]] 表示对象是哪一个类型,Object.prototype.toString会把参数变为对象再做处理
1  | var toString = Object.prototype.toString;  | 
[[extensible]] 表示这个对像是否可扩展
1  | var obj = {x:1,y:2};  | 
序列化
1  | var obj = {x:1,y:2,val:undefined,a:NaN,c:new Date()};  | 
序列化-自定义
1  | var obj = {x:1,o:{o1:1,o2:2,toJSON:function(){return this.o1+this.o2}}};  | 
其它对象方法
1  | var obj = {x:1,y:2};  | 
当valueOf 和 toString都存在时 拼接和 + 时,都会尝试把对象转化为基本类型,会先去valueOf 若返回的是对象则会去找toString