这里主要和大家谈一些不容易注意或者平时没有系统整理过的知识点,经常用但是最总是被忽略的
1.语法
1.区分大小写
js是严格区分大小写的,typeof关键字不能写作typeOf。一个函数可以命名位typeOf但是不能是typeof
2.标识符
- 第一个字母必须是_,$或者字母[不能用数字开头]
- 别的字符可以是_,$或者字母,数字
3.注释
- /* **/多行注释
- 单行注释 //
4.严格模式
"use strict"//定义不同的解析执行模式 整个脚本或者function中添加
作用是对某些不安全的操作抛出错误
function doSomeThing(){
"use strict"
}
5.语句
- 一般语句后面加上
;
,这样能够增加代码性能,但是如果省略了不会出错。 - 可以使用{}把多条语句组合成一个代码块。在if等语句中都会使用
6.保留字和关键字
很多有特殊意义的字我们都不能将它设置为变量名。比如:var boolean等
7.变量
js里面的变量都是松散类型的,eg:var a
;我们并不能判断a
是什么类型的数据。即a
可以保存所有类型的数据。当然在没有设置值的时候,a也是有一个初始值的undefined
。我们在修改值的同时,也可以修改a
保存的类型,但是我们一般不这样做。
!!!注意
- 使用
var
将变量定义在它所在作用域范围内,当它出了这个范围,变量会被销毁。
function test(){
var msg="你好";
console.log(msg);//你好
}
console.log(msg);//错误
- 如果没有使用var定义变量,默认会在全局定义变量。
function test(){
msg="你好";
console.log(msg);//你好
}
console.log(msg);//你好
// 注意一般不建议这样 会在严格模式下报错 并且解析有问题
- 定义多个变量
var msg="你好", age=18;
//!!!注意var msg="你好"; age=18;相当于age定位全局变量
8.数据类型
简单数据类型:Undefined
,Null
,String
,Number
,Boolean
复杂数据类型:Object
9.typeof操作符
- 先声明,typeof是操作符,不是函数
- 为大家总结一下typeof能够返回的所有值
function
,undefined
,string
,number
,boolean
,object
接下来列举一些特殊的值
typeof a; //undefined
typeof 123; //number
typeof true; //boolean
typeof "123"; //string
typeof function a(){}; //function
typeof [1,2,3]//object
typeof null;//object
在没有es6之前,typeof 是一个绝对安全的操作符;
9.undefined类型
- 在声明了变量,但是没有赋值,变量的值默认就是undefined。我们也可以显示的为变量赋值为undefined,但是这样没有意义。
- 声明了变量没赋值和没有声明变量是不一样的
var a;
console.log(a);//undefined
console.log(b);//出错
显式的初始化变量是非常有必要的。
- 因为在使用没有声明过的变量会出错,但是有一个操作符
typeof()
在es5的环境下始终安全。返回为undefined
。我们经常在声明了变量立马赋值,这样我们可以利用typeof检测变量名是否已经声明过了。为undefined
就是未声明过。
10.Null类型
- 这里注意
typeof(null); //object
- 如果我们声明一个变量用于保存对象,但是暂时没有值,我们会赋值为
null
null == undefined //true
- 不明白,这里的指针不是不一样么?为什么===会是true,注意==和===的区别;
var bb = null;
var cc = null;
bb === cc; //true
11.Boolean类型
只有true和false是布尔值,True和False是标识符
这里主要是介绍一些值转化为bool类型的值。
- String里面的空字符串为false
- Number里面的0和NaN会转化为false
- Object里面的null会转化为false
- Undefined里面都转化为false
这些主要是在if语句中会使用
12.Number类型
- 进制表示
0x
16进制var num = 0xA
表示10
0
8进制var num = 010
表示8
0
无效8进制var num = 090
表示9因为超出了8进制。八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。
+0 === -0; // true
所有的值计算时都是转化为10进制
- float值
js会尽量把float值转化为正数类型以节约空间。
var num = 1.0; //1
var num1 = 1.; //1
1.0 === 1; //true
js对于极大或者极小的数字采用科学记数法。
var num = 3.125e7;//31250000
js中不要测试小数相加的值。会不精确
var a = 0.1+0.2; //0.30000000000000004
3.数值范围
js里面能够表示的数据的值的范围时有限的,因此,我们在计算的时候可能需要看看数据是否超出计算范围
+-Infinity无法参与下一次运算
// 不能明白为什么能够表示Number.MAX_VALUE + 1
// 不能明白为什么isFinite(Number.MAX_VALUE + 1)//true
//js里面能表示的最大的数值
Number.MAX_VALUE//1.7976931348623157e+308
//js里面能表示的最小的数值
Number.MIN_VALUE//5e-324
//是否在表示范围内
isFinite(Number.MAX_VALUE)//true
isFinite(Number.MAX_VALUE*2)//false
isNaN(Number.MAX_VALUE*2)
4.NaN
这表示一个非数字。我们在转转数值时经常碰到不能转化情况,得到的值就是NaN
注意任何涉及NaN的操作都是返回NaN。
NaN+10;//NaN
注意NaN不等于NaN
NaN == NaN; //false
js提供了isNaN()
方法,判断这个字符是不是非数字。注意这里会发生一定的转化,字符串和boolean会尽量转化为数字,这里就提供一些值给大家阅览
isNaN(NaN); // true
isNaN(10); // false
isNaN("10"); // false
isNaN("0x10"); // false
isNaN(false); // false
isNaN("false"); // true,不提供双重转化
注意这个方法也适用于对象,会调用对象的valueof()
方法或者toString()
方法,再进行响应转化
- 数字转化
这里有三个方法
Number()
:1.
true转化为1,false转化为02.
null转化为03.
undefined转化为NaN4.
字符串能识别10进制和16进制。不能进行2次转化。空字符串转化为0
parseInt()
:1.
字符串的转化会忽略前面的空格,第一个字符必须是符号或者数字,否则值为NaN。知道遇到字符不是数字。2.
可以识别10进制,16进制,8进制。3.
提供第二个参数,进制。用于识别是什么进制的数据。
parseFloat()
:1.
会忽略前置0.遇到第二个小数点就会截止。2.
只识别10进制的数据。
13.String类型
- 可以由
"
或者'
包含。不过以什么开头就以什么结尾。 - 转义字符也会被当做一个字符解析。
- 可以通过
.length
属性取得字符串长度。 - 字符串一旦被创建,就不能被修改。我们修改字符串其实是这样的过程。
1.
销毁原来的字符串2.
创建能容纳新字符串的对应空间3.
字符串填充 - toString()方法。
1.
除了null和undefined没有这个方法,别的都可以进行调用。2.
其中数值调用可以传入参数表示转化为多少进制。 - string()方法。转化为字符串。可以把任何值转化为字符串。
- 转化字符还有一个简便方法
+''
。也可以转化任意值。
14.Object类型
- 创建方式
var o = new Object;
var o1 = {};
- obj类型每个实例都有自己的方法和属性
1.
constructor:创建当前对象的函数。
2.
hasOwnProperty():检查给定的属性是否存在于当前的实例。并且该属性不存在于原型中。
function Person(){
this.eat = function(){
'i am eating';
}
}
p.hasOwnProperty('eat')//true
p.constructor;//ƒ Person(){this.eat = function(){'i am eating'}}
p.propertyIsEnumerable('eat');//true
p.toString()//"[object Object]"
p.toLocaleString()//"[object Object]"
3.
isPrototypeOf():检查传入对象是否是当前对象的原型。
4.
propertyIsEnumerable():属性是否可以列举。
5.
toString()和toLocalString(),valueOf()此处不一一详解了。
15.操作符
1.一元操作符
++ -- + -
1.
这里将一元操作符分为前置性和后置性。具体区别可以自己进行查阅,不做过多讲解。
2.
但是有一点需要注意它会把字符串尽量转换为数字,应用方法是Number()
;不能转化是指为NaN;注意Number(false)=0;
Number(true)=1
3.
至于对象会调用对象的valueof方法,然后再进行运算。
2.位操作符
这里不做过多讲解。想要了解的同学可以通过源码,反码,补码等进行了解。注意:按位与或非、左移、右移 是的数字是按位操作运算
3.布尔操作符
逻辑与或非也是布尔操作符 && || !
1.
注意&&,第一个为假,不运算第二个。第一个为真会返回第二个值
2.
注意||,第一个为真,不运算第二个。第一个为假会返回第二个值
3.
!的话注意一些比较特殊的值即可
3.乘性操作符
注意于NaN和Infinity的特殊运算即可
4.加性操作符
1.
注意于NaN和Infinity和+-0的特殊运算
2.
+ 有字符串连接作用和数字相加。但是只要相加的项中有字符串,则为字符串拼接。除非用()进行隔离运算。
3.
- 则相反,会尽量把所有项,转换为数字进行运算'3'-'2' //1
5.关系运算符
< > >= <=
只要里面有一个是数字,则转化为数字进行比较。别的为ASCII码比较。如果不能转化则返回false
6.相等操作符
== === != !===
1.
== 会尽量进行转化。===不会进行转化
7.条件操作符
条件?执行true的时候值:执行false时候的值。
8.赋值运算发
+= -= *= /=
eg: a += 2;//a = a+2
9.逗号操作符
1.
一个语句执行多个操作var a=1,b=2,c=3
2.
赋值是记住最后一个值var a = (1,2,3,4) //a=4
16.语句
1.条件语句if()
,switch(){case :}
2.循环语句while(){}
,do{}while()
,for()
,!!!for(... in ...):枚举对象属性
3.其他语句break
,continue
,with
,label
17.函数
1.函数以及return
function 函数名(){
//函数体;
//return 可以用于返回值 但是她执行后会退出函数;
//直接写return 返回的是undefined值
}
2.函数参数
函数体中永远不会介意你传递进来的参数类型和参数的个数,因为,!!!参数在函数内部是用一个数组表示的
,由arguments对象来记录表示。它类似数组但是不是数组。arguments的值和变量的名字和值是相对应的,arguments值改变,变量的值改变
。命名参数只是提供便利,但不是必须的。
3.函数没有重载。
js中函数没有重载,定义了相同名称的函数,后面的函数会覆盖前面的函数。