JS基础知识总结(ECMA Script部分)

2019-02-24  本文已影响71人  reneeChoi

前言

最近总觉得自己所学到的Javascript基础知识不够系统,所以重新学习了Javascript的基本知识并有了这篇文章的产出,这篇文章主要是总结ECMA 262的的语法标准。

这篇文章的主要内容是小结于慕课网的视频课程《前端JavaScript面试技巧》, 如有错误,请多指正,谢谢。

1. 变量类型和计算

1.1 按储存方式区分变量类型

另外,typeof运算符结果:undefined,string,number,Boolean,object,function。(typeof只能区分值类型的详细类型, 区分引用类型时只能区分出函数)

1.2 JS中的内置函数

1.3 JS内置对象

Math, JSON

1.4 如何理解Json

1.5 强制类型转换

1.5.1 if() {} if里会转换成false

0: false
NaN: false
'': false
null: false
false: false
undefined: false

1.5.2 === 与==

另外,何时用===,何时用==? 除了以下这种写法用==,其余全部用===

if(obj.a == null){
    //这里相当于obj.a === null || obj.a === undefined 简写形式
    //这是jquery源码中推荐的写法
}

1.6 构造函数

1.6.1 构造函数的特点
1.6.2 构造函数的扩展

2. 原型和原理链

2.1原型

2.1.1 5条原型规则(是学习原型链的基础)
2.1.2 补充
var item
for(item in f){
    //高级浏览器已经在for in中屏蔽了来自原型的属性
    //但是这里建议大家还是加上这个判断,保证程序的健壮性
    if(f,hasOwnProperty(item)){
        console.log(item);
    }
}

2.2原型链

instanceof

f instanceof Foo的判断逻辑是:
1. f的__proto__一层一层往上,能否对应到Foo.prototype
2. 再试着判断f instanceof Object

2.3 New一个对象的过程

3. 闭包和作用域

3.1 作用域

3.1.1 执行上下文
  1. 全局:变量定义,函数声明(一段<script>)
  2. 函数:变量定义、函数声明、this、arguments (函数中)
    另外, ”函数声明“与“函数表达式”的区别:比如函数声明是functon fn(){ }, 函数表达式是var fn = function(){};
fn()//不会报错
function fn(){
    //函数声明, 全局上下文提取到fn()函数
}

fn1()//会报错
var fn1 = function(){
    //函数表达式,全局上下文会提取到fn1为undefined
}


fn('zhangsan')
function fn(name){
    //函数
    console.log(this);
    console.log(arguments);
}

3.2 作用域概念

3.2 闭包

function F1(){
    var a = 100;
    return function(){
        console.log(a) //100
    }
}

var f1 = F1();
var a = 200
f1()

4. 异步和单线程

4.1 异步

  1. 在可能发生等待的情况:在等待的过程中程序仍然要执行其他操作。
  2. 等待过程中不能像 alert 一样阻塞程序运行。
  1. 定时任务:setTimeout,setInterval
  2. 网络请求:ajax 请求,动态 <img> 加载、脚本等文件下载和加载。
  3. 事件绑定

4.2 单线程

由于js是单线程,在代码执行的时候又不能因为执行需要等待的代码而造成阻塞,因此js会首先将无需等待的(同步)的代码执行完成后,来处理异步的代码,如果达到异步代码的执行条件的话,就会执行。

console.log(1)
setTimeout(function(){//因为setTimeout是异步,所以执行时会被暂存起来
    console.log(2)
}, 0)
console.log(3)
setTimeout(function(){
    console.log((4))
},1000)
console.log(5)

//打印顺序 1 3 5 2 4

5. 其他知识点-日期和Math,数组API,对象API

5.1 日期常用的API

Date.now() //获取当前时间毫秒数
var dt = new Date();
dt.getTime()  //获取毫秒数
dt.getFullYear() //年
dt.getMonth()  //月(0-11)
dt.getDate()  //日(0-31)
dt.getHours() //小时
dt.getMinutes() //分钟(0-59)
dt.getSeconds() //秒(0-59)

5.2 Math常用的API

Math.random()  //(0-1)
//常见的用法:清除缓存,比如说网站访问链接,同一个链接会使同一个缓存,链接后面加上一个随机数,就可以清楚缓存

5.3数组API

  1. forEach 遍历所有元素
  2. every 判断所有元素是否都符合条件
  3. some 判断是否有至少一个元素符合条件
  4. sort 排序
  5. map 对元素重新组装,生成新数组
  6. filter 过滤符合条件的元素

5.4 对象API(for in)

var arr = [1, 2, 3]
arr.forEach(function(item, index){
    console.log(index, item)
})

// 0 1
// 1 2
// 2 3

var arr = [1, 2, 3]
var result = arr.every(function(item, index){
    if(item<4){
        return true;
    }
})
console.log(result) // true

var arr = [1, 2, 3]
var result2 = arr.some(function(item, index){
    if(item<2){
        return true
    }
})
console.log(result2) //true

var arr = [5,4,3,2,1]
var arr2 = arr.sort(function(a,b){
    //从小到大排序
    console.log(a+'..'+b)
    return a-b
    //从大到小排序
    // return b-a
})
console.log(arr2)

var arr = [1,2,3,4]
var arr2 = arr.map(function(item,index){
    //将元素重新组装,并返回
    return '<b>'+item+'</b>'
})
console.log(arr2)

var arr = [1,2,3]
var arr2 = arr.filter(function(item,index){
    //通过某一个条件过滤
    if(item >= 2){
        return true
    }
})
console.log(arr2)

//对象代码的例子
var obj={
    x:100,
    y:200,
    z:300
}
var key
for(key in obj){
    //hasOwnProperty判断是不是obj原生的属性
    if(obj.hasOwnProperty(key)){
        console.log(key,obj[key])
    }
}
上一篇 下一篇

猜你喜欢

热点阅读