JavaScript 基础
概览
可选的分号:
JavaScript并不是在所有换行处都填补分号;只有在缺少了分号就无法正确解析代码的时候,JavaScript才会填补分号;换句话讲,如果当前语句和随后的非空格字符不能当成一个整体来解析的话,JavaScript就在当前语句行结束处填补分号。
var a
a
=
3
console.log(a);
解析为:var; a=3; console.log(a);
var x = x + f
(a + b).toString()
解析为:var y = y + f(a+b).toString();
两个例外:
1,涉及return、break和continue的地方。
return
true
解析为:return; true;
2,涉及++和--的地方
如果将其当做后缀表达式
x
++
y
解析为: x;++y;
基础
数据类型
JavaScript数据类型分为两种
-原始类型(primitive type):数字、字符串和布尔值。
-对象类型(object type):对象是属性(property)的集合,每个属性都由“名/值对”构成。
两个特殊的原始值:null(空)和undefined(未定义)
数字
Math.round(),四舍五入
Math.ceil(),向上取整
Math.floor(),向下取整
超过数字上限(溢出):infinity
超过数字下限:-infinity
infinity的加减乘除运算结果还是无穷大(保留它们的正负号)
被零除,,返回正无穷大或负无穷大
0/0返回NaN。
无穷大除以无穷大,给任意负数开方或者算术运算符与不是数字或无法转换为数字的操作数一起使用时,都将返回NaN
NaN:和任何值都不相等,可以用x!=x来判断,当且仅当x为NaN时,这个表达式才为true。
var ezro = 0; 正常的零值
var negz = -0; 负零值
zero === negz; true 正零值和负零值相等
1/zero === 1/negz; false 正无穷大和负无穷大不等
字符串
在JavaScript中,字符串时固定不变的,类似replace和toUpperCase的方法都返回新字符串,原字符串本身并没有发生变化。
布尔值
这些值都被转换成false:undefined、null、0、-0、NaN、""
null和undefined
对null执行typeof,返回object
undefined:未定义
null == undefined true
null === undefined false
类型转换
undefined 转换为 NaN(数字)
null 转换为 0(数字)
“” 转换为 0(数字)
“one” 转换为 NaN(数字)
true 转换为 1(数字)
false 转换为 0(数字)
null==undefined true
“0”==0 true;字符串转成数字
0==false true;布尔值转成数字
“0”==false true:字符串和布尔值转换成数字
对象转换为原始值
toString():返回一个反映这个对象的字符串;
valueOf():如果存在任意原始值,它默认讲对象转换为表示它的原始值,而且大多数对象无法真正表示为一个原始值,因此valueOf方法默认返回对象本身;
转换为布尔值:true
转换为字符串:
1,如果对象具有toString()方法,则调用这个方法,如果返回原始值,则将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
2,如果对象没有toString方法,或者这个方法并不返回一个原始值,那么JavaScript会调用valueOf方法。如果存在这个方法,则JavaScript调用它,如果返回原始值,则将这个值转换为字符串(如果本身不是字符串的话),并返回这个字符串结果。
3,否则JavaScript无法从toString或valueOf获得一个原始值,将抛出一个类型错误异常。
转换为数字:
1,如果对象具有valueOf()方法,后者返回一个原始值,则将这个值转换为数字(如果需要的话),并返回这个结果。
2,如果对象有toString方法,后者返回一个原始值,则JavaScript将其转换并返回。
3,否则JavaScript无法从toString或valueOf获得一个原始值,将抛出一个类型错误异常。
变量作用域
声明提前
JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。
云算法
加法
加法操作符的行为表现为:
1,如果一个操作数是对象,则对象会遵从对象到原始值的转换规则转换为原始值
日期:toString()
其他:valueOf()
由于多数对象都不具备可用的valueOf方法,因此它们会通过toString方法来执行转换。
2,执行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个穿也会转换成字符串,然后进行字符串连接。
3,否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。
例子
1 + 2 //3,加法
“1” + “2” //“12”,字符串连接
“1” + 2 //“12”,数字转换为字符串以后,进行字符串连接
1 + {} //“1[object Object]”,对象转换为字符串后进行字符串链接
true + true //2,布尔值转换为数字后做加法
2 + null //2,null转换为0
2 + undefined //NaN,undefined转换为NaN后做加法
1 + 2 + “ blind mice”//“3 blind mice”
1 + (2 + “ blind mice”)//“12 blind mice”
==和===
==相等运算符
===严格相等运算符
!=:与==求反
!==:与===求反
===:首先计算其操作数的值,然后比较这两个值,没有任何类型转换
1,如果两个值类型不相等,则不相等
2,如果两个值都是null或者undefined,则不相等
3,如果两个值都是布尔值true或都是布尔值false,则相等
4,如果一个值是NaN,或者两个值都是NaN,则不相等。NaN和其他任何值都不相等,包括它本身,可以使用x!==x来判断是否为NaN,只有在x为NaN的时候,这个表达式的值才为true
5,如果两个值为数字且数值相等,则他们相等。如果一个值为0,一个为-0,则同样相等
6,如果两个值为字符串,且所含的对应位上的16位数完全相等,则相等;两个字符串可能含义完全一样且显示的字符也一样,但具有不同编码的16位值,则不相等JavaScript并不对Unicode进行标准化的转换
7,如果两个值指向同一个对象、数组或函数,则相等,如果指向不同的对象,则不相同,尽管两个对象具有完全一样的属性
==相等运算符和恒等运算符相似,但相等运算符的比较并不严格,如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较。
1,如果两个操作数的类型相同,则和严格相等的比较规则一样,比较结果也一样
2,如果两个操作数的类型不同,==也可能认为他们相等,检测相等将会遵守如下规则
a,null==undefined
b,数字和字符串,先将字符串转换为数字,然后使用转换后的值进行比较
c,一个true,将其转换为1,然后在比较;一个falsee,将其转换为0,再进行比较
d,如果一个值是对象,另外一个值是数字或字符串,则将对象转换为原始值,再进行比较。对象通过toString或者valueOf方法转换为原始值
e,其他不同类型之间的比较均不相等
例子:
“1” == true //true
比较运算符
比较运算符的操作数可能是任何类型,不是数字的字符串的操作数都将进行类型转换,类型转换规则如下:
1,操作数为对象,先转换为原始值,如果valueOf返回一个原始值,那么直接使用这个原始值,否则,使用toString的转换结果进行比较
2,转换为原始值后,如果两个操作数都是字符串,将按照字母表的顺序对两个字符串进行比较,这个字母表顺序是组成这个字符串的16位Unicode字符的索引顺序
3,对象转换为原始值之后,如果至少有一个操作数不是字符串,那么两个数都将转换为数值进行比较。0和-0是相等的,Infinity比其他任何数字都大(除了Infinity本身),-Infinity比其他任何数字都小(除了-Infinity本身)。如果一个操作数是(或转换后是)NaN,那么比较操作符总是返回false
对于数字和字符串操作符来说,加号运算符和比较运算符都有所不同,前者更偏爱字符串,如果它的一个操作数是字符串的话,则进行字符串连接操作,而比较运算符偏重数字,更偏爱数字,只有两个操作数都是字符串的时候,才会进行字符串的比较
<=和>=运算符在判断相等的时候,并不依赖相等运算符和严格相等运算符的比较规则,相反,小于等于只是简单的不大于,大于等于只是简单的不小于,只有一个例外,那就是当其中一个操作数是(或者转换后是)NaN的时候,所有的四个比较运算符均返回false
in运算符
in运算符希望它的做操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象。
如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true
void
void是一元运算符,出现在操作数之前,操作数可以是任意类型。
操作数通常会照常计算,但忽略计算结果并返回undefined。