js 基础
主要原则
就近原则
语法注意
- javascript中严格区分大小写
- js中如果不写分号,浏览器会自动添加,但是会消耗一些系统资源。而且有些时候,浏览器会加错分号。
- JS中会忽略多个空格和换行,所以我们可以利用空格和换行对代码进行格式化。
字符集
使用unicode字符集编写的,区分大小写。html中编写一些事件属性可以不区分大小写,但是在javascript中必须区分大小写(监听事件一般使用小写)。
unicode转义序列
为了支持老旧程序员,javascript可以使用6个ASCII字符来代表16位unicode内码。这些unicode转义序列均以\u为前缀,其后跟4个十六进制数。这种转义可以直接用在javascript的直接量中、正则表达式直接量和标识符中。
在字符串中使用转义字符输入Unicode编码 \u四位编码
在网页中使用Unicode编码 &#编码;
这里的编码需要的是10进制
字面量和变量
字面量(直接量)
字面量都是一些不可改变的值,就是常量。
变量
变量可以用来保存字面量,而且变量的值是可以任意改变的变量更加方便我们使用。在js中使用var关键字来声明一个变量。
如果声明变量未赋值,变量的类型会转化为undefined,这里表示js的变量知道当前变量是什么类型的变量。
标识符
标识符就是个名字,对变量和函数进行命名。以字母、下划线、数字及美元符开始,后续跟字母、下划线、数字或美元符(数字不允许出现在首位)。
-
标识符中可以含有字母、数字、_ 、$。
-
标识符不能以数字开头。
-
标识符一般都采用驼峰命名法。
-
标识符不能是ES中的关键字或保留字。
JS底层保存标识符时实际上是采用的Unicode编码,所以理论上讲,所有的utf-8中含有的内容都可以作为标识符。
数据类型
数据类型指的就是字面量的类型。在JS中一共有5种基础数据类型,以及引用类型。检测变量类型typeof。
String
Number
javascript中所有的数字都是number类型,包括整数和浮点数。
Number.MAX_VALUE、Number.MIN_VALUE表示数字的最大值和最小值。
JavaScript预定义了全局变量Infinity和NaN:
Infinity表示正无穷大,-Infinity表示负无穷。 被零整除在JavaScript并不报错:它只是简单的返回无穷大(Infinity)或负无穷大(-Infinity)。
**NaN 表示Not a number, 表示不是一个数字。**它和任何值都不相等,包括自身。也就是说,没办法通过x==NaN
来判断变量x是否是NaN
。相反,应当使用x!=NaN
来判断,当且仅当x
为NaN
的时候,表达式的结果才为true
。函数isNaN()
的作用与此类似,如果参数是NaN
或者是一个非数字值(比如字符串和对象),则返回true
。JavaScript
中有一个类似的函数isFinite()
,在参数不是NaN
、Infinity
或-Infinity
的时候返回true
。
Infinity //将一个可读/写的变量初始化为infinity
Number.POSITIVE_INFINITY //同样的值,只读
1/0 //这也是同样的值
Number.MAx_VALUE + 1 //计算结果还是Infinity
Number.NEGATIVE_INFINITY //该表达式表示了负无穷大
-Infinity
-1/0
-Number.MAX_VALUE - 1
NaN //将一个可读/写的变量初始化为NaN
Number.NaN //同样的值,但是只读
0/0 //计算结果是NaN
Number.MIN_VALUE/2 //发生下溢:计算结果为0
-Number.MIN_VALUE/2 //负零
-1/Infinity //同样是负零
-0
负零值同样有些特殊,它和正零值是相等的(甚至使用JavaScript的严格相等测试来判断)。这意味着这两个值几乎一模一样,除了作为除数之外.
如果使用JS进行浮点运算,可能得到一个不精确的结果。所以千万不要使用JS进行对精确度要求比较高的运算。
Boolean
Null
null
是JavaScript语言的关键字,它表示一个特殊值,常用来描述“空值”。
对null
执行typeof预算,结果返回字符串“object”,但是null定位在基本数据类型里面。也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”。
null的使用场景:初始对象赋值、释放对象、清空数组、清空变量。
Undefined
Undefined(未定义)类型的值只有一个,就undefind。当声明一个变量,但是并不给变量赋值时,它的值就是undefined
引用类型
对象类型包含数组、对象、函数
类型转换
转换和相等性
由于JavaScript可以做灵活的类型转换,因此其“==”相等运算符也随相等的含义灵活多变。例如,如下这些比较结果均是true:
null == undefined //这两值被认为相等
"0" == 0 //在比较之前字符串转换成数字
0 == false //在比较之前布尔值转换成数字
"0" == false //在比较之前字符串和布尔值都转换成数字
“”等于运算符在判断两个值是否相等时要做类型转换,“=”恒等运算符在判断相等时并未做任何类型转换。
显示转换
做显式类型转换最简单的方法就是使用Boolean()、Number()、String()或Object()函数。当不通过new运算符调用这些函数时,它们会作为类型转换函数并按下图
Number("3") // => 3 Number(x)如果参数有非数字的字符串(例如:"12px")会返回结果是为NaN,使用ParseInt()代替
string(false) //"false”或使用false.toString()
Boolean([]) // => true
object(3) //new Number(3)
需要注意的是,除了null或undefined之外的任何值都具有toString()方法,这个方法的执行结果通常和String()方法的返回结果一致。该方法不会影响到原变量,它会将转换的结果返回。Number类定义的toString()方法可以接收表示转换基数(radix)的可选参数,如果不指定此参数,转换规则将是基于十进制。指定某种进制,可以将数字转换为其他进制数(范围在2~36之间),例如:
var n = 17;
binary_string = n.toString(2); //转换为"10001"
octal_string = "o" + n.toString(8); //转换为“o21"
hex_string ="ox" + n.toString(16); //转换为“ox11"
JavaScript中的某些运算符会儆隐式的类型转换,有时用于类型转换:
+
运算符的一个操作数是字符串,它将会把另外一个操作数转换为字符串。
一元+
运算符将其操作数转换为数字。例如:x += 1; +x;
一元!
运算符将其操作数转换为布尔值并取反。例如: !x
parseInt()
函数和parseFloat()
函数(它们是全局函数,不从属于任何类的方法)更加灵活。parseInt()
只解析整数,第二个参数,来指定数字的进制。而parseFloat()
则可以解析整数和浮点数。这两个函数会忽略非数字字符串。如果对非String使用parseInt()或parseFloat()它会先将其转换为String,然后在操作。
运算符
运算符的优先级
上表所示的运算符是按照优先级从高到低排序的,每个水平分割线内的一组运算符具有相同的优先级。运算符优先级控制着运算符的执行顺序。优先级高的运算符(表格的顶部)的执行总是先于优先级低(表格的底部)的运算符。
算数表达式
“+” 运算符
二元加法运算符“+”可以对两个数字做加法,也可以做字符串连接操作。当两个操作数都是数字或都是字符串的时候,计算结果是显而易见的。然而对于其他情况来说,加号的转换规则优先考虑字符串连接,如果其中一个操作数是字符串或者转换为字符串的对象,另外一个操作数将会转换为字符串,加法将进行字符串的连接操作。如果两个操作数都不是类字符串(string-like)的,那么都将进行算术加法运算。
从技术上讲,加法操作符的行为表现为:
-
如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始类值:日期对象通过toString()方法执行转换,其他对象则通过valueOf()方法执行转换(如果valueof()方法返回一个原始值的话)。由于多数对象都不具备可用的valueof()方法,因此它们会通过toString()方法来执行转换。
-
在进行了对象到原始值的转换后,如果其中一-个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
-
否则,两个操作数都将转换为数字(或者NaN),然后进行加法操作。
任何值做- * /
运算时都会自动转换为Number
,使用下面方法可以将字符串转换成number:
var d = "123";
d = d - 0;
console.log(typeof d);
console.log(d);
一元运算符
在一元运算符中的+
和-
可以表示正、负。
+
正号不会对数字产生任何影响。
对于非Number类型的值,它会将先转换为Number,然后在运算可以对一个其他的数据类型使用 +, 来将其转换为number。它的原理和Number()函数一样。
a = 18";
a = +a;
console.log("a = "+a); //a = 18
console.log(typeof a); // number
-
负号可以对数字进行负号的取反
位运算符
关系表达式
非数值的情况:
对于非数值进行比较时,会将其转换为数字然后在比较。
比较两个字符串时,比较的是字符串的字符编码。比较字符编码时是一位一位进行比较,如果两位一样,则比较下一位。
console.log("bbc" < "b"); //true
如果比较的两个数字字符串型,可能会得到不可预期的结果,所以必须进行转型。
相等和不等运算符
相等运算符(equality operator),它用来检测两个操作数是否相等,这里“相等”的定义非常宽松,可以允许进行类型转换。
“===”严格相等运算符不允许进行类型转换。
相等运算符“==”和恒等运算符相似,但相等运算符的比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较:
- 如果两个操作数的类型相同,则和上文所述的严格相等的比较规则一样。如果严格相等,那么比较结果为相等。如果它们不严格相等,则比较结果为不相等。
- 如果两个操作数类型不同,“==”相等操作符也可能会认为它们相等。检测相等将会遵守如下规则和类型转换:
- 如果一个值是null,另一个是undefined,则它们相等。
- 如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。
- 如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。
- 如果一个值是对象,另一个值是数字或字符串,则使用3.8.3节所提到的转换规则将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueof()方法转换为原始值。JavaScript语言核心的内置类首先尝试使用valueof(),再尝试使用toString(),除了日期类,日期类只使用toString()转换。那些不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值。
- 其他不同类型之间的比较均不相等。
比较运算符
in 运算符
instanceof 运算符
逻辑表达式
对于非布尔值进行与或运算时,会先将其转换为布尔值,然后再运算,并且返回原值。
逻辑与(&&)
如果第一个值为true,则必然返回第二个值(原值)。例如:var result = 5 && 6
result 为 6;
如果第一个值为false,则直接返回第一个值(原值)。
逻辑或(||)
如果第一个值为true,则直接返回第一个值(原值)。例如:var result = 5 || 6
result 为5;
如果第一个值为false,则直接返回第二个值(原值)。
逻辑非(!)
表达式计算
和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一-个值。JavaScript通过全局函数eval()来完成这个工作:
eval("3+2") // =>5
动态判断源代码中的字符串是一种强大的语言特性,几乎没有必要在实际中应用。如果你使用了eval()
,你应当仔细考虑是否真的需要使用它。