JS查漏补缺

362 阅读4分钟

JSON.stringify()

  • 将一个 JavaScript 对象或值转换为 JSON 字符串
  • 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值
  • 函数、undefined 被单独转换时,会返回 undefined
  • NaN 和 Infinity 格式的数值及 null 都会被当做 null。

Math.random

  • 返回 0(含)和 1(不含)之间的随机数

Array

  1. 改变原数组
  • push() 在数组尾部添加元素,返回的是更新后数组的长度。
  • pop() 删除数组的最后一个元素,并返回
  • shift() 删除数组的第一个元素,并返回
  • unshift() 在数头尾部添加元素,返回的是更新后数组的长度。
  • reverse() 降序
  • sort() 升序
  • splice(index,howmany,要添加的新数据),返回被删除元素所组成的数组。
  1. 不改变原数组
  • concat()
  • join()
  • slice()数组元素截取(开始位置,结束为止)
  1. Array.from()
  • 从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例

事件的三个阶段

  • 捕获阶段
  • 目标阶段
  • 冒泡阶段: 事件绑定是在冒泡阶段,所以事件的执行是由里到外

event.stopPropagation

  • 阻止继续向外冒泡

事件的委派

将事件统一绑定给元素共同的祖先元素(后代元素事件触发时,通过冒泡,通过祖先元素的响应函数来处理事件),这样可以只绑定一次,即可应用到多个元素上。事件的委派利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能event中的target表示的触发事件的对象 ,使用它对触发事件的元素进行判断

["0x1", "0x2", "0x3"].map(parseInt) 的结果

  • 结果:[1,NaN,0].
  • parseInt(string, radix)
  • 参数radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
  • parseInt("0x1", 0): 不存在0进制,发现“0x1”是一个16进制的数,所以它会把“0x1”当作一个16进制的数然后再转化为10进制
  • parseInt("0x2", 1):因为没有不存在1进制的数,所以就直接返回NaN
  • parseInt("0x3", 2):“0x3”当作二进制数然后转化为10进制数,二进制数就只包含0和1,所以在“0x3”中在满足条件的最前面就只有0,所以二机制0转化为10进制为0.

字符串虽然有长度,但是的它的截断方法不生效,数组的话就会生效

var str = "我非常喜欢编程";
str.length = 3;
console.log(str);

一道题

function test() {           
    getName = function() { 
        Promise.resolve().then(() => console.log(0)); 
        console.log(1);               
    };
    return this; 
}
test.getName = function() { 
     setTimeout(() => console.log(2), 0); 
     console.log(3);               
};
test.prototype.getName = function() {    
     console.log(4); 
};       
var getName = function() { 
     console.log(5);             
};
function getName() {
     console.log(6); 
}      
test.getName();  // 3  2(宏)
getName();  //5
test().getName(); //1  0( 微)
getName();  // 1  0(微)
new test.getName();// 3  2(宏)
new test().getName();  // 4
new new test().getName(); //4
// 3 5 1 1 3 4 4 0 0 2 2

Object.defineProperty

  • Object.defineProperty(obj, prop, descriptor)
    • obj: 要定义属性的对象
    • prop: 要定义或修改的属性的名称或Symbol
    • descriptor: 要定义或修改的属性描述符
      • 数据描述符: 一个具有值的属性,该值可以是可写的,也可以是不可写的
      • 存取描述符: 由 getter 函数和 setter 函数所描述的属性
  • 描述符
    • 数据描述符存取描述符 都是对象
    • 一个描述符只能是这两者其中之一;不能同时是两者
    • 这两种描述符都是对象
    • 共有可选键值
      • configurable:属性能否被删除。默认值为false
      • enumerable:属性能否被枚举。默认值为false
    • 数据描述符还具有以下可选键值
      • value: 属性对应的值。默认值为undefined
      • writable:属性能否被更改。默认值为false
    • 存取描述符还具有以下可选键值
      • get: 属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。默认值为undefined
      • set:属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。默认值为undefined

generator 生成器

  • 生成器对象是由一个 generator function 返回的
  • Generator.prototype.next()
    • 返回一个包含属性 done 和 value 的对象
    • 也可以通过接受一个参数用以向生成器传值
  • Generator.prototype.return(value)
    • 返回给定的值并结束生成器
function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

let g = gen();
console.log(g.next())  //{value: 1, done: false}
console.log(g.next())  //{value: 2, done: false}
console.log(g.next())  //{value: 3, done: false}
console.log(g.next())  //{value: undefined, done: true}