Js中的基本概念

前言:刚毕业的应届生,学习前端时间并不长,昨天参加面试,一轮笔试,两轮技术面试。尤其在技术面试的时候感觉到自己基础知识还是搞的有些乱,也突然明白到了一个扎实的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.操作符

  • 一元操作符(++,–,+,-)

    1. 如果对于字符串进行操作,会返回NAN
    2. s1 = +s1 ->相当于把s1转化成数值型(前提看s1之前是什么类型,规则不同)
    3. s1 = -s1 ->相当于把s1转化成数值的同时变成了负值
  • 位操作符

    1. 按位非(~)
      var num1 = 25;
      var num2 = ~num1
    2. 按位或(|)
    3. 按位与(&)
    4. 按位异或(^)
  • 逻辑操作符:逻辑操作符都是短路操作,如果第一个操作能决定结果,就不执行第二个操作
  • 加减法操作符

    • 注意以下问题:”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.没有重载

这篇只是一些简单的基础知识点,之后会把这些细小知识点分别展开写成文章

    原文作者:andy00614
    原文地址: https://segmentfault.com/a/1190000015848257
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞