var point = {x: 1, y: 2};
point
Objectx: 1y: 2__proto__: Object__defineGetter__: __defineGetter__()__defineSetter__: __defineSetter__()__lookupGetter__: __lookupGetter__()__lookupSetter__: __lookupSetter__()constructor: Object()hasOwnProperty: hasOwnProperty()isPrototypeOf: isPrototypeOf()propertyIsEnumerable: propertyIsEnumerable()toLocaleString: toLocaleString()toString: toString()valueOf: valueOf()get __proto__: __proto__()set __proto__: __proto__()
'valueOf' in point
true
'__proto__' in point
true
'x' in point
true
'z' in point
false
var array = [4,5,6]; 4 in array
false
'4' in array
false
0 in array
true
'0' in array
true
instanceof 实例运算符
所有的对象都是Object的实例。
理解原型链~
var d = new String('test');
d instanceof String
true
d instanceof Date
false
d instanceof Object
true
1. 原始表达式-primary expression
表达式的原子级别。最小。常量/直接量、关键字、变量。 常量/直接量:1.23、'hello'、/pattern/----back to part3\10 关键字/js的一些保留字:true false null this 变量:i、sum、 undefined 当变量不存在时,表达式运算结果为undefined
2. 对象和数组的初始化表达式-对象直接量\数组直接量-新创建的对象和数组
不同于布尔直接量,非原始表达式,含有子表达式。 数组初始化表达式:[]、[1+2, 3+4]、[[1,2,3].[2,3,4]]、 [1,,,,,5] 这种中间空位会被填充为 undefined。
对象表达式:
3. 函数定义表达式-函数直接量-function
定义一个js函数。 以下代码中可以区别函数直接量和函数。 函数后不用加; 而函数直接量需要加;区分是声明变量结束。
4. 属性访问表达式-得到一个对象属性、或数组元素的值。(第六章)
. 运算和[]运算 先计算.[]运算符前的表达式,若为null或undefined,则抛出异常。so,经常用obj&&obj.x 这种语句判断。属性不存在,则返回undefined。 点运算符只适用要访问的属性名称是合法的标识符,且需要知道要访问的属性名。 用$.each可以遍历属性。 若属性名为保留字或包含空格和标点或是数字(数组而言),须使用方括号。 属性名是运算得出的值而不是固定值时,须用方括号。 对象属性:
数组属性:
5. 调用表达式-调用函数或方法。(第八章)
若函数使用return语句,则这个返回值为整个调用表达式的值。否则为undefined。 方法调用是针对一个对象里的方法而言。其实最终都是函数了~~(第九章) 普通函数调用,通常使用全局对象作为this的值,ES5严格模式下,this值为undefined。 了解严格模式 5.7.3
6. 对象创建表达式-创建一个对象并调用构造函数初始化新对象的属性。
7. 运算符概述-关键字运算符、标点运算符。
delete instanceof
delete 删除属性
当你删除一个数组元素时,数组的 length 属性并不会变小。
8. 算术表达式
9.关系表达式
相等和不等运算符
== 可以允许类型转化。 === 则不允许类型转化。
NaN 跟谁都不等,所以 x !== x ,可以用来判断x是不是NaN~~
比较运算符
一般用于数字和字符串。
加号运算符和比较运算符的区别,加号以字符串优先,比较则以数字为优先。
in 运算符
instanceof 实例运算符
所有的对象都是Object的实例。 理解原型链~
10. 逻辑表达式
以下等价:
11. 赋值表达式
= 给变量或属性赋值。 优先级很低的~
12. 表达式计算
eval
解释运行由 JS 源码组成的字符串,并返回值。 尽量不要用。
eval() 的问题:动态执行代码。 解释器不能提前优化。 当eval被赋值给其他变量时,调用该变量的方法很难优化。
eval() 传参字符串,并对该字符串当成JS代码进行编译(parse),编译成功后就执行该段代码。失败则抛出异常。
eval() 解析后的代码,如果有变量和eval外的代码相同,eval会使用该变量,甚至有可能改变该变量的值。 即,eval会改变它所在环境下的变量,如果很不幸这个eval在最顶层处调用,则会影响全局函数和全局变量。。
当其他代码来影响你的代码时,你的代码将会变得多么不可控~~~
严格eval
私有上下文环境的局部eval~ 严格模式下,可以查询或更改局部变量,不能在局部作用域中定义新的变量或函数。 更像一个运算符~
但是,能不用就不要用了~~
13. 其他运算符
条件运算符~
?: 三目运算~
typeof运算符
两种写法~
void 运算符
一般用于 url中。