前言:刚毕业的应届生,学习前端时间并不长,昨天参加面试,一轮笔试,两轮技术面试。尤其在技术面试的时候感觉到自己基础知识还是搞的有些乱,也突然明白到了一个扎实的Js基础对于之后的路是有多重要。准备把Js高级程序设计的重点知识从头梳理一遍。特此记录一下自己学习的一些自认为比较重要的笔记。看似最难走的路,可能却是最快也是最稳的。
1.严格模式
是ECMAScript5引入的一个概念。目的是使Ecma3中的不确定行为得到处理,一些不安全的行为也会抛出错误。它的支持版本比较高,IE10+
2.标识符
就是函数、变量、属性的名字。标识符不能用保留字和关键字,使用关键字会导致identitierExpected错误,保留字看特定引擎报错
3.变量
Js变量是松散类型的,可以用来保存任何类型的数据。
如果变量定义在函数中,那么这个变量在函数退出后就会被销毁。
e.g.
function test() {
var msg = 'hi';
}
console.log(msg) // 报错
检查一个错误:
报错message未定义,为什么呢?
答:因为没执行啊
4.数据类型
ECMA中一共有5种简单数据类型(基本数据类型)数据类型:undefined null boolean string number,1种复杂数据类型:Object
- Null : 就记住他叫空对象指针就行,所以typeof 是 Object。在定义一个暂时不用的对象变量时候,最好将这个变量赋值为null,体现出了它的概念特性,也区分了它和undefined的不同。
- Boolean:if这种流控制语句,会自动将括号里的内容进行Boolean()操作
- Number: NAN 表示应该返回数值的操作最后没有返回数值,比如说2/'i',2/0不是NAN,是Infinity。第二点:NAN与任何值都不相等, 包括NAN。有一个函数isNaN(),这个函数的具体思路为:先看能不能转化成数值(10,'10',Boolean),如果能则返回flase,不能的话返回true。理解number和parseInt的区别:parseInt('')是NAN,而Number是0;parseInt遇上非数字字符会停止,而Number直接NAN,比如小数点;
- String:数值,布尔值,对象,和字符串都有toString()方法。只有number下的toString方法有第二个参数,表示转化成几进制后的值,其实有个String()方法更好一些,如果是null返回null,如果是undefined返回undefined,如果不是这两个将默认使用toString()方法;另外一个小技巧,把某个值转化为字符串直接用+""就可以了
- Object:Object每个实例都存在一些属性和方法:constructor,hasOwnproperty,toString …
5.操作符
-
一元操作符(++,--,+,-)
- 如果对于字符串进行操作,会返回NAN
- s1 = +s1 ->相当于把s1转化成数值型(前提看s1之前是什么类型,规则不同)
- s1 = -s1 ->相当于把s1转化成数值的同时变成了负值
-
位操作符
- 按位非(~)
var num1 = 25;
var num2 = ~num1 - 按位或(|)
- 按位与(&)
- 按位异或(^)
- 按位非(~)
- 逻辑操作符:逻辑操作符都是短路操作,如果第一个操作能决定结果,就不执行第二个操作
-
加减法操作符
- 注意以下问题:"a:"+1+2 //应该输出a12而不是a3
- var result1 = 5 - "true" //4
- Var result2 = NaN -1 //NaN
- Var result3 = 3 - "" // 3
- Var result4 = 3 - "2" // 1
-
关系操作符:
-
如果在关系操作符比较中,有一个值是数值,那么另一个值也会被强制转换成数值,如:
- Var result = ‘23’ < 3 //true var result = ’23’ < ‘3’ //false
-
任何操作数与NaN比较都是false
- Var result1 = NaN < 3 //false
- Var result2 = NaN >= 3 //false
-
-
相等操作符
- ==和!=是先进行转换再比较
- ===和!==是不转换直接进行比较
- 所以由于相等(== !=)存在数据类型的转换问题,为了保持代码类型的严谨性最好用 ===,还有一个细节,如果用相等符号进行比较,虽然比较的过程中可能会进行类型的转换,但不影响最终的变量类型e.g:
var strEg = '1'; if(strEg == 1){ console.log(typeof strEg) // string } console.log(typeof strEg) // string
6.语句
1.label,continue和break
break是立即退出当前层的循环,continue是重新开始下一层的循环,开始下一层的循环,例子
var num = 0;
for(var i=0;i<10;i++) {
for(var j=0;j<10;j++) {
if(i == 5 && j == 5) {
break; //TODO:95
// continue; //99
}
num ++
}
}
label和continue,break连用,可以起到在那层退出(break)或在那层强制执行下次循环(continute)作用,例如
var num = 0;
Outermost:
for(var i=0;i<10;i++) {
for(var j=0;j<10;j++) {
if(i == 5 && j == 5) {
break Outermost;
}
num ++ // 55
}
}
var num = 0;
Outermost:
for(var i=0;i<10;i++) {
for(var j=0;j<10;j++) {
if(i == 5 && j == 5) {
continue Outermost;
}
num ++ // 95
}
}
2.with语句
会导致性能下降,一般不用。为什么不能直接用对象代替呢?
3.switch语句
switch语句中的条件判断是全等操作,没有类型转换的操作。
7.函数
1.Return:只能用于函数中,立即退出函数并返回值。不能用在if,for的代码块中。如果return的值为空,则立即停止执行函数,并返回undefined
2.传递的参数和arguments并不是同一个内存空间,只是他们的值是同步的,同时argument的长度是由执行时传入的参数决定的,而不是定义时决定的。
3.没有重载
这篇只是一些简单的基础知识点,之后会把这些细小知识点分别展开写成文章
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。