大纲
弱类型的特性,隐式转化逻辑
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