该浏览器不支持canvas

部分易错JS知识点整理(缓慢填坑)

主要还是各地搜刮来的,本人对于这方面的总结还是8彳亍,给各位大佬磕头了砰砰砰

 

1.

 2.JS闭包和匿名对象以及作用域

 

js在执行之前,会将所有带var和function的进行提前定义和声明。(带var的提前声明,function声明和定义都完成了)
首先,在全局作用域下,进行预解释:
test=xxxfff000(开辟一个堆内存,里面存的是代码字符串)
var result(声明一个变量result)
var  result2(声明一个变量result2)
-------------------------------
代码执行:
result=test()  -->将test执行的返回结果赋值给result,是一个对象,再开辟一个堆内存,test执行,形成一个私有作用域A
再进行预解释和代码执行等一系列操作
result2=test()  同理
result.add()  -->方法执行形成一个私有作用域
n++  顺着作用域链向上寻找到test作用域A(A这个作用域不销毁,因为被全局变量result占用了)中的n为4399,n++ 》4400
(这时test这个作用域A下的n变成4400)
(1)   console.log(n)  //4400   
==============================
result.add()   -->方法执行形成一个新的私有作用域
n++  顺着作用域链向上寻找到test作用域(A)中的n为4400,n++ =》4401
(2)   console.log(n)  //4401  
===============================
(3)   console.log(result.n)  //4399
此时找的只是result对应的那个堆内存中的n
===============================
result2.add()  -->方法执行形成一个私有作用域
n++ 顺着作用域链向上寻找到test作用域(B)中的n为4399,n++ =》4400
(3)   console.log(n)  //4400 

 3.

函数声明

function sum(a,b){
    return a+b
}

函数表达式

var sum = function(a,b){
    return a+b
}
Function构造函数【从技术角度讲,这是一个函数表达式】
var sum = new Function('a','b','return a+b')//不推荐使用,影响函数解析性能

 4.

JavaScript有3大对象,分别是本地对象内置对象宿主对象

  • 本地对象

    • 与宿主无关,独立于宿主环境的ECMAScript实现提供的对象。
    • 简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。
    • 这些引用类型在运行过程中需要通过new来创建所需的实例对象。
    • 包含:ObjectArrayDateRegExpFunctionBooleanNumberString等。
  • 内置对象

    • 与宿主无关,独立于宿主环境的ECMAScript实现提供的对象。
    • 在 ECMAScript 程序开始执行前就存在,本身就是实例化内置对象,开发者无需再去实例化。
    • 内置对象是本地对象的子集。
    • 包含:GlobalMath
    • ECMAScript5中增添了JSON这个存在于全局的内置对象。
  • 宿主对象

    • 由 ECMAScript 实现的宿主环境提供的对象,包含两大类,一个是宿主提供,一个是自定义类对象。
    • 所有非本地对象都属于宿主对象。
    • 对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,浏览器对象有很多,如WindowDocument等。
    • 所有的DOMBOM对象都属于宿主对象。
5.JS的全局函数

 6.

“==”运算符(两个操作数的类型不相同时)

  • 如果一个值是null,另一个值是undefined,则它们相等
  • 如果一个值是数字,另一个值是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。
  • 如果其中一个值是true,则将其转换为1再进行比较。如果其中的一个值是false,则将其转换为0再进行比较。
  • 如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值,再进行比较。

对象到数字的转换

  • 如果对象具有valueOf()方法,后者返回一个原始值,则JavaScript将这个原始值转换为数字(如果需要的话)并返回一个数字。
  • 否则,如果对象具有toString()方法,后者返回一个原始值,则JavaScript将其转换并返回。(对象的toString()方法返回一个字符串直接量(作者所说的原始值),JavaScript将这个字符串转换为数字类型,并返回这个数字)。
  • 否则,JavaScript抛出一个类型错误异常。

空数组转换为数字0

  • 数组继承了默认的valueOf()方法,这个方法返回一个对象而不是一个原始值,因此,数组到数学的转换则调用toString()方法。空数组转换为空字符串,空字符串转换为数字0.

7.

在函数中,可以通过该引用更改传递对象的内容,但是你不能修改调用者具有的引用,因为你的引用只是一个副本:

var foo = {'bar': 1};

function tryToMungeReference(obj) {
    obj = {'bar': 2};  // won't change caller's object
}

function mungeContents(obj) {
    obj.bar = 2;       // changes _contents_ of caller's object
}

tryToMungeReference(foo);
foo.bar === 1;   // true - foo still references original object

mungeContents(foo);
foo.bar === 2;  // true - object referenced by foo has been modified

 8.

javascript中实现跨域的方式总结

  • 第一种方式:jsonp请求;jsonp的原理是利用<script>标签的跨域特性,可以不受限制地从其他域中加载资源,类似的标签还有<img>.
  • 第二种方式:document.domain;这种方式用在主域名相同子域名不同的跨域访问中
  • 第三种方式:window.name;window的name属性有个特征:在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。
  • 第四种方式:window.postMessage;window.postMessages是html5中实现跨域访问的一种新方式,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源。
  • 第五种方式:CORS;CORS背后的基本思想,就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。
  • 第六种方式:Web Sockets;web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。

9.

typeof Symbol()    //"symbol"
typeof Number()    //"number"
typeof String()    //"string"
typeof Function()    //"function"
typeof Object()    //"object"
typeof Boolean()    //"boolean"
typeof null    //"object"
typeof undefined    //"undefined"
posted @ 2019-07-24 09:23  真是啰嗦  阅读(217)  评论(0)    收藏  举报