运算符和表达式
标识符与表达字
- 关键字,保留字不能作为标识符
- 访问属性的方式
- 通过点号(.)运算符
- 通过中括号([])运算符
- window对象属性
- 全局变量是 window 对象的属性
- 全局函数是 window 对象的方法
运算符与表达式
-
字面量
-
运算符
-
运算符优先级
-
逻辑运算符
-
两边的操作数都是布尔类型时
- 对于&&来说, 除了两侧都为真时为真,其他情况都为假
- 对于| |来说, 除了两侧都为假时为假,其他情况都为真
-
两侧的操作数不是布尔类型
- 首先将左操作数转换成布尔类型
- 对转换后的左操作数进行逻辑判断(true or false)
- 根据短路原则返回原始左操作数或原始右操作数
-
短路原则
-
console.log(2&&4); //4 console.log({x:2}&&{name:"Jack"}); //{name:Jack} console.log(2||4); //2 console.log({x:2}||{name:"Jack"}); //{x:2}
-
应用
- 使用||设置函数参数的默认值
- 使用&&提升程序的健壮性
- 使用||和&&实现条件语句(减少代码量,增加执行效率)
-
-
-
比较运算符(=、)
-
递增递减(++、–)
-
赋值运算符
-
多级赋值
-
var a = {n: 1}; var b = a;//b被赋值为a,因此b就是对象{n:1} a.x = a = {n: 2}; //a.x指的是给a添加一个x属性,在js的运算中“.”和"="运算符同时出现,会先执行"."运算 //因此先给a.x赋值,再给a赋值 //先执行:a.x={n:2},这里a并未改变,是给a的x属性赋值为{n:2},a还是{n:1} //给{n:1}这个对象增加了名为x的属性 //再执行a={n:2},变量a被重新赋值为一个新的对象{n:2}; console.log(a); //{n:2} console.log(b); //a的二次赋值,并没有影响b,b还是{n:1},但是{n:1}这个对象,增加了一个x属性 console.log(a.x);//{n:2}对象没有x属性,所以结果是undefined console.log(b.x);//综上所述,这个结果是{n:2}
-
var a = { n: 1 }; a.x = a = { n: 2 }; console.log(a.x); //undefined
-
-
表达式
- 函数表达式
- IIFE:立即执行的函数表达式
- 建立函数作用域限制变量的作用域
- 解决ES5作用域缺陷(没有块作用域)所带来的问题,如:变量污染、变量作用域等问题)
语句
对象的属性特性
对象与属性
- 对象是一种复合值,是若干无序属性的集合
- 函数作为某一个对象的属性时,称其为该对象的方法
- 操作数据就是操作对象的属性
- 对象的创建:
- 对象字面量方式
- Object的create静态方法
- 构造函数
- 对象分类:
- 内置对象(构造器函数对象、非构造器对象)
- 宿主对象
- 自定义对象
- 属性的种类
- 数据属性
- 访问器属性
- 内置属性
数据属性及其特性
- 数据属性的特性
- value:属性的值
- writable:可写性 —— 是否可以改写
- configurable:可配置特性 —— 是否能删除以及其他特性是否可配置
- enumerable:可枚举特性
- 属性描述符
- 设置 —— Object.defineProperty(obj, prop, descriptor)
- obj —— 要在其上定义属性的对象
- prop —— 要定义或修改的属性的名称
- descriptor —— 将被定义或修改的属性描述符
- 查询 —— Object.getOwnPropertyDescriptor(obj,prop)
- 设置 —— Object.defineProperty(obj, prop, descriptor)
- 枚举性 ——是否能枚举: obj.propertyIsEnumerable(prop)
- 定义属性
- 属性不存在 —— 创建新属性,由描述符指定特性,未指定使用默认值
- 属性存在 —— 更新描述符指定的属性特性,没有对应的特性保持不变
访问器属性及其特性
-
间接访问属性的方法(访问和设置时都不加括号,没有function关键字)
-
属性特性
-
get(读取):读取属性时调用的函数,该函数计算读取的结果,默认是 undefined
-
set(设置) :设置属性值时调用的函数,该函数接受设置的值作为参数,默认是undefined
-
configurable
-
enumerable
-