一、数据类型
1、六种数据类型
(1)原始类型
number(数字)、string(字符串)、boolean(布尔值)、null和underfined。
(2)对象类型
object(对象){ function(函数)、Array(数组)、Date(日期) }
2、隐式转换
“37”-7 //30 此处'-'为减法运算 “37”+7 //377 “+”为字符串拼接
(1)严格等于
a === b 类型不同返回false。
new Object ≠new Object 对象的比较是用 引用去比较而不是值去比较
例:【1,2】==【1,2】返回false。因为不是他同一个对象,同样两个空对象也不会相等。
(2)等于
若类型相同,和‘===’一样
若不同,尝试类型转换和比较
例:“1.23” == 1.23 当等号一边是字符串一边是数字时,会尝试把字符串转化为数字再进行比较。
boolean ==? 把布尔值先转换为数字 object==? 把对象转换为基本类型。
3、包装对象
string/number/boolean三个基本类型有对应包装类型,在把这几个基本类型当作对象使用时,js会创建一个对应的临时包装对象,然后进行操作,操作完毕后会消除临时对象,基本类型依然是基本类型,并无变化。
例:var a='string'; alert(a.length); //6 a.t = 3; alert(a.t) //undefined
4、类型检测
(1)typeof 适用于基本类型和函数对象 遇到null会返回object
(2)instanceof 适合判断对象类型(基于原型链判断) 在不同的iframe和window之间检测时失效
instanceof 期望左操作数是对象(obj),若不是直接返回false,右操作数必须是一个函数对象或函数构造器,若不是会抛出一个type error异常。原理是判断左操作数的对象的原型链上是否有 右边构造函数的prototype属性。
任何一个构造函数都有一个prototype对象属性,将用作使用 new 构造函数 这样的方式去构造出对象的原型
(3)Object.prototype.toString 适用于基本类型和数组、函数
例:Object.prototype.toString.apply([]) ie6/7/8 null和undefined失效
二、表达式和运算符
1、表达式
表达式是指能计算出值的任何可用程序单元。 ——Wiki
表达式是一种js短语,可使js解释器用来产生一个值。——js权威指南
(1)原始表达式:常量、直接量、关键字、变量
(2)复合表达式:两个原始表达式之间加一个运算符 例:1+1
(3)数组、对象的初始化表达式: 例:【1,2】 = new Array(1,2);
(4)函数表达式:匿名的函数赋给一个变量,或者把函数括起来直接调用
(5)属性访问表达式: 例: var o ={x:1}; o.x o【‘x’】
(6)调用表达式: 函数名加上一个括号调用。 func();
(7)对象创建表达式: 用new建一个构造器或函数,可以传参。
2、运算符
根据操作数可分为一元:+num 二元:a+b 三元 : c?a:b(判断c的布尔值是否为true,是取a,不是取b)
还有 赋值‘=’、比较‘==’、算数‘-’、位‘|’、逻辑‘&&’、字符串‘+’、特殊等等。。。
特殊的运算符:
(1)条件运算符 : c?a:b
(2)‘,’运算符: 逗号运算符表达式的每一个元素都会被计算,但是最后取的值是逗号最右边的值
(3)'delete'运算符:删除对象上的属性。ie9开始有一个Object.defineProperty方法,可以设置一个configurable标签,为true表示可以被delete,false则不可以。
(4)'in'运算符: 判断对象中是否有某属性。 window.x =1; 'x' in window; //true
(5)'instanceof','typeof'运算符:instanceof是判断对象的类型,是基于原型链取判断。typeof返回的是字符串,一般常用于原始类型或对象。 例:{} instanceof Object //true typeof 100 === 'number' //true
(6)'new'运算符: 通过new可以创建一个构造器的实例(新的对象)。hasOwnProperty方法可以判断属性是对象上的还是对象的原型链上的。通过__proto__可以拿到对象的原型。
(7)'this'运算符: 在全局作用域下,this会指向window。在不同的情况有不同的值。
(8)'void'运算符:一元运算符,不管void后面的操作数是多少,最后都会返回undefined。
运算符优先级:。。。