Javascript
Novice-XiaoSong
这个作者很懒,什么都没留下…
展开
-
javascript 零碎知识点
持续更新ing…javascirpt中的数字在计算机内存储为多少Byte?[ 8 Byte]原创 2020-11-18 16:13:57 · 194 阅读 · 0 评论 -
javascript 暂时性死区
暂时性死区:ES6之前JS的一个BUG(美其名曰暂时性死区)。在使用 typeof 等运算符操作一个未声明的变量时,不会报错,该变量的值以 undefined 作处理ES6:ES6的变量声明方法(let, const, class…)解决了暂时性死区问题,会进行显式报错。ES6之前的暂时性死区console.log(typeof a); // undefined (no error)ES6之后的变量声明console.log(typeof a); // Uncaught Refe..原创 2020-12-13 17:37:46 · 1115 阅读 · 0 评论 -
javascript 类数组
一、什么是类数组具有 length 属性,且其属性为非负整数(类索引)的对象不具有数组的方法二、常见的类数组函数的 arguments 对象DOM 对象列表(比如通过 document.querySelectorAll 得到的列表)三、类数组与数组的相互转换1. 数组转类数组Array.prototype.push.apply(arrayLike, array)var array = [1,2,3];var arrayLike = {};Array.prototype.pu原创 2020-11-25 18:05:00 · 218 阅读 · 0 评论 -
javascript 严格模式
ES5 引入严格模式一、严格模式的使用使用 use strict 表明脚本或函数开启严格模式use strict 声明必须放在第一行,否则将导致严格模式声明无效(严格来说,是必须放在具有实际运行作用的第一行代码前,例如可以放在一个空分号后边)脚本中<!-- 严格模式声明只在当前script内有效 --><script> 'use strict'; console.log('严格模式')</script><script> c.转载 2020-11-24 17:50:46 · 122 阅读 · 0 评论 -
javascript with语句
不要用withwith语句with 的初衷为了避免冗余的对象调用foo.bar.data.x = 1;foo.bar.data.y = 2;foo.bar.data.z = 3;with (foo.bar.data){ // 改变块内作用域 x = 1; y = 2; z = 3;}但其实用变量替换的方法也可以轻松解决var o = foo.bar.data;o.x = 1;o.y = 2;o.z = 3;所以with似乎本来就没有存在的必要。到了如今,会去用wit.转载 2020-11-24 16:18:19 · 181 阅读 · 0 评论 -
javascript 获取字符串每个字符的字节数
String.prototype.charCodeAt(idx) 获取某个字符的编码值(转为10进制)实现function func(_str){ let result = []; for(let i=0, len=_str.length; i<len; i++){ result.push(Math.ceil( Math.log2(_str.charCodeAt(i)) / 8) ) } return result;}...原创 2020-11-22 10:16:32 · 423 阅读 · 0 评论 -
javascript prototype vs. __proto__
一、prototypeprototype 是函数特有的原型对象,原型上的方法和属性会被函数的实例共享(这个时候这个函数应该称为类比较合适了)prototype 都有一个 constructor 属性,指向类的自身function Animal(){}Animal.prototype.say = function(){ console.log("hello world")}let cat = new Animal();// 1. cat.say(); // hello world/原创 2020-11-20 12:43:23 · 122 阅读 · 0 评论 -
ES6 Symbol类型
一、基本语法Symbol(descriptor) : descriptor为其描述值,但无法用来反向检索到Symbolconst s = Symbol('name')二、Symbol.for & Symbol.keyForSymbol.for(descriptor): 创建一个单例SymbolSymbol.keyFor(Symbol): 查找该Symbol对应的descriptor,必须是用Symbol.for定义的,否则返回undefinedconst s1 = Symb原创 2020-11-18 23:18:56 · 89 阅读 · 0 评论 -
javascript window.isNaN vs. Number.isNaN
一、window.isNaNwindow.isNaN(1) // falsewindow.isNaN('1') // falsewindow.isNaN(true) // falsewindow.isNaN(null) // false 注意window.isNaN(Symbol()) // TypeError: Cannot convert a Symbol value to a numberwindow.isNaN(undefined) // truewindow.isNaN('原创 2020-11-18 21:02:56 · 974 阅读 · 0 评论 -
javascript Array.isArray
Array.isArray(obj) 可以用来判断obj是不是一个数组Array.isArray 是ES5引入的方法,可以使用Object.prototype.toString.call()来实现Array.myIsArray = function(_obj){ return Object.prototype.toString.call(_obj) === '[object Array]';}Array.isArray vs instanceofArray.isArray 可以用..原创 2020-11-18 11:51:09 · 375 阅读 · 0 评论 -
javascript ==与!=的比较规则(加踩坑)
概述: 使用 == 进行比较,当两个比较元类型不同时,会实现进行类型转换。(这也是其与 === 的本质区别)转换规则:当只有一方是 boolean 时,先将 boolean 转 number。(true: 1, false: 0)当一方 number 一方 string 时,string 转 number。(Number(string), 结果可能是 NaN)当只有一方是 object 时,object 调用 valueOf() 获取其原始值(1)若 valueOf() 方法返回值的类型不是对.原创 2020-11-13 18:34:17 · 202 阅读 · 0 评论 -
javascript ==、===、Object.is()的区别
区别== :等于,两边值类型不同的时候,先进行类型转换,再比较;=== :严格等于,只有当类型和值都相等时,才相等;Object.is(value1, value2) :与 === 的作用基本一样,但有些许不同。(1)===: +0、-0、0 相等;Object.is 不相等(2)===: NaN 与自身不等;Object.is 相等...转载 2020-11-11 16:38:29 · 153 阅读 · 0 评论 -
javascript Map和WeakMap
一、Map与对象的区别(1)对象的键只能是字符串或Symbol。强行传入对象作为键,会使用其类型名(字符串)作为键,例如:[object object](2)Map支持任何类型的键。(对象类型的键本质是使用其指针来作为键)Map.prototype.sizeMap.prototype.constructor([iterable]) 参数为二维数组[ [key1, value1], [key2, value2] ]Map.prototype.set(key, value)Map.proto原创 2020-11-10 15:35:27 · 246 阅读 · 0 评论 -
javascript Set与WeakSet
一、SetSet.prototype.sizeSet.prototype.constructor([iterable])Set.prototype.add()Set.prototype.delete()Set.prototype.clear()Set.prototype.has()Set.prototype.forEach()Set.prototype.keys()Set.prototype.values()Set.prototype.entries()Set只存放键,值与键相同原创 2020-11-10 15:19:28 · 207 阅读 · 0 评论 -
javascript 模拟new的实现
引用MDN对new运算符的定义: new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。MDN: new操作符会干下面这些事:(1) 创建一个空的简单JavaScript对象(即{})(2) 链接该对象(即设置该对象的构造函数)到另一个对象(3) 将步骤1新创建的对象作为this的上下文(4) 如果该函数没有返回对象,则返回this我稍微重新解释下2,转为实现步骤:(1) 创建obj(2) 链接类的原型到obj的原型上(3) 在obj中创建类的对象作用域(4)..原创 2020-11-10 12:07:33 · 161 阅读 · 0 评论 -
javascript 使用function*/yield模拟简单模式的async/await
function* 模拟 asyncyield 模拟 await简单模式:yield 后边只能跟着 promise,且不进行异常处理function asyncFunc(){ function run(_genFunc){ /* * 启动器 * @param {Generator Function} _genFunc: 生成器函数 */ return new Promise(resolve=>{ let gen = _genFunc(); functi.转载 2020-11-18 10:59:18 · 341 阅读 · 0 评论 -
javascript 字符串常用方法
字符串常用方法转载 2020-11-04 17:18:32 · 81 阅读 · 0 评论 -
javascript 自执行函数
一、自执行函数的4种形式(function (_param){ console.log(_param); })(1)(function (_param){ console.log(_param); }(1))!function (_param){ console.log(_param); }(1) // !可以改为其他运输符或者void((_param)=>{ console.log(_param); })(1)二、需要注意的是,自执行函数只能在自执行时调用,不能在外部被调用(funct原创 2020-11-03 18:01:23 · 362 阅读 · 0 评论 -
数据结构 实现堆
堆分类:最大堆、最小堆堆别名:优先队列堆应用:求topK,堆排序堆模板function Heap(_arr, _compareFunc){ // 私有属性 let heap = []; // 对象公有属性 this.size = 0; // 私有方法 // 计算左、右、父节点索引 let left = () => {}; let right = () => {}; let parent = () => {}; // 堆的shiftU.原创 2020-11-03 11:55:27 · 146 阅读 · 0 评论 -
javascript 判断函数是否作为构造函数
构造函数中 this 指向 new 创建的实例。所以可以通过在函数内判断 this 是否为当前函数的实例进而判断当前函数是否作为构造函数。function F(){ if(this instanceof F){ console.log('我现在是作为构造函数') } else { console.log('我现在是普通函数') }}F(); // 我现在是普通函数new F(); // 我现在是作为构造函数...原创 2020-10-31 12:21:51 · 2321 阅读 · 0 评论 -
手写 实现bind()
逐步实现js的bind方法一. 无参数版 bindES6之前Function.prototype.myBind = function(_context){ // _context检测 _context = _context? _context: window; let that = this; // 按要求返回闭包(函数) return function(){ // 函数挂入_context内 _context.__fn = that; // 函数调用 let res.原创 2020-10-31 12:15:15 · 821 阅读 · 0 评论 -
javascript 箭头函数获取参数列表
箭头函数中无法使用 arguments 获取函数参数。可以使用ES6的解构语法来代替。let func = (...args) => { console.log('函数的参数是:', args);}func(1, 2, 3);// 函数的参数是: [1, 2, 3]原创 2020-10-31 11:16:32 · 2336 阅读 · 0 评论 -
手写 实现call(), apply()
一、call()ES6之前Function.prototype.myCall = function (_context){ // _context空检测 _context = _context? _context: window; // 获取函数参数 let args = []; for(let i=1, len=arguments.length; i<len; i++){ // 避开在eval时组装参数中字符串的麻烦 args.push('arguments[' + i +原创 2020-10-31 02:49:51 · 141 阅读 · 0 评论 -
javascript console对象
方法说明assert(expr, msg)expr 为 false 时输出 msgclear()清空控制台所有输出,将光标回置到第一行。count(msg)用于计数,输出它被调用了多少次。error(msg)在信息最前面加一个红叉,表示出错,同时会显示错误发生的堆栈。group(msg), groupEnd()用于将显示的信息分组,可以把信息进行折叠和展开。groupCollapsed(msg)与console.group方法很类似,唯一的区别是...转载 2020-10-30 00:42:23 · 53 阅读 · 0 评论 -
javascript 浏览器事件循环
执行栈:放置需要执行的同步任务任务队列宏任务(task):<script>标签的整体代码、setTimeout、setInterval、setImmediate、I/O、UI渲染微任务(micro-task):Promise的resolve、reject,await、process.nextTick、Object.observe、MutationObserver事件循环(event-roop)从宏任务队列中取第一个任务,丢入执行栈中执行完执行栈中的所有任务(期间有宏任务或微.原创 2020-10-30 00:17:24 · 80 阅读 · 0 评论 -
javascript 一句话描述什么是原型链
当试图查找一个对象的某个属性时,不仅仅会在对象上查找,还会查找对象的原型,以及对象原型上的原型,层层向上,直到查找到第一个名称相同的属性或者到达一个空的原型,这个就是javascript的原型链机制。其中每一层的原型所构成的这条查找链就是原型链。...原创 2020-10-29 17:41:53 · 515 阅读 · 0 评论 -
javascript 变量的声明与提升
一、var没有块的概念(可以跨块访问,不能跨函数访问)未初始化时默认为 undefined变量提升可重复定义(使用变量提升解释)变量提升var 声明的变量在js中会经历了两个阶段编译阶段进行变量声明提升执行阶段进行赋值下面举几个栗子// 栗子1console.log(value);var value = 8;console.log(value);// js进行变量提升后实际的执行顺序是var value;console.log(value);value原创 2020-12-02 19:48:54 · 157 阅读 · 0 评论 -
javascript 知识点汇总
一、ES6数据类型基本数据类型(6种),引用数据类型(2种)类型检查(3种)类型转换boolean为false的6种情况undefine, null, true/false 转为 number二、对象属性: 自有属性、原型属性属性检测...原创 2020-10-30 10:58:41 · 104 阅读 · 0 评论 -
javascript 继承详解(5+1)种
function SuperClass(){ this.superValue = true; this.referData = ['first', 'second', 'third'];}SuperClass.prototype.superPublicFunc = function(){ console.log(`I'm superClass!`);}一、原型链继承实现: 将父类的实例赋值给子类的原型对象function SubClass(){ this.subValue = true原创 2020-10-27 21:21:24 · 126 阅读 · 0 评论 -
javascript 防抖、节流
一、防抖实现function doSomething(){ console.log(document.body.scrollTop);}/** * 防抖函数 debounce * 在第一次触发操作时,延迟操作;后续触发操作时,判断当前是否有timer,有的话直接重置timer,进而实现防抖 * @param { Function } _fn: 事件触发后要执行的操作 * @param { Number } _delay: 延时(ms) * @return { Function }:转载 2020-10-27 13:01:21 · 107 阅读 · 0 评论 -
javascript 数组的增删改查、遍历与常用方法
增:push(item1, item2...): 末尾插入 […, item1, item2… ]unshift(item1, item2, ...): 开头插入 [ item1, item2… , …]splice(startIndex, ?deleteCount, item1, item2...): 任意位置concat(?item, ?Array): 末尾插入, 返回数组副本 删:pop(): 删除数组末尾元素,并返回shift(): 删除数组首部元素,并返回slice(start.原创 2020-10-26 18:02:01 · 200 阅读 · 0 评论 -
javascript 浏览器中函数的 this 指向
调用方法function函数箭头函数普通函数this 指向 window 对象this 指向 window 对象函数作为对象的方法this 指向调用方法的对象this 指向 window 对象构造函数this 指向 new 创建出的对象箭头函数不能作为构造函数bind, apply, callthis 指向新绑定的对象this 保持原先的指向 (箭头函数的this指向是固定的)...原创 2020-11-10 11:18:46 · 225 阅读 · 0 评论 -
javascript bind, call, apply方法的区别
方法参数返回值Function.prototype.bind(thisArg, arg1, arg2...)新函数Function.prptotype.call(thisArg, arg1, arg2...)函数执行后的返回值Function.prototype.apply(thisArg, args: [])函数执行后的返回值原创 2020-10-26 17:34:31 · 62 阅读 · 0 评论 -
javascript 箭头函数的this指向
使用箭头函数时的注意事项箭头函数有几个使用注意点。函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象(无法使用bind, apply修改)。不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。不可以使用yield命令,因此箭头函数不能用作Generator函数。...转载 2020-10-26 16:50:24 · 149 阅读 · 0 评论 -
ES6 生成器与yield关键字
一、生成器(generator)形如 function* () { } 的函数为生成器函数二、yield关键字yield 关键字要配合生成器使用生成器中的yield的作用类似与return,会返回一个 Generator 对象( Generator 本质是一个特殊的 Iterator )。function* generatorFunc() { let arr = [1, 2]; for(let i=0; i<arr.length; i++){ yield arr[i]; }}l原创 2020-10-26 16:39:26 · 187 阅读 · 0 评论 -
javascript 属性描述符(descriptor)
一、定义新属性与其描述符Object.defineProperty(o, propName, descriptor) 定义单个属性(1) 描述符可拥有的键值描述符configurableenumerablevaluewritablegetset数据描述符√√√√XX存取描述符√√XX√√(2) 示例let o = {};// 数据描述符属性Object.defineProperty(o, 'data1', { configu原创 2020-10-26 15:31:10 · 258 阅读 · 0 评论 -
javascript 本地属性、继承属性、原型链
Javascript 具有本地属性(own property),也有一些属性是从原型对象继承而来的,称为继承属性。function Obj() { this.x = 10; // 本地属性 own property}Obj.prototype.x = 0; // 继承属性Obj.prototype.y = 1; // 继承属性let o = new Obj();console.log(o)打印结果如下:原型链假设要查询对象o的属性y, 如果本地属性中不存在y, 那么会继续在o的原.原创 2020-10-26 14:00:40 · 370 阅读 · 0 评论 -
javascript 属性遍历
// 测试数据定义let symbolKey = Symbol('symbolKey');function Obj(){ this.ownKey = 1; this[symbolKey] = 2;}Obj.prototype.prototypeKey = 3;let o = new Obj();Object.defineProperty(o, 'unenumerableKey', { enumerable: false, value: 4})for...in 获取所有可枚举的属性原创 2020-10-26 13:57:15 · 167 阅读 · 0 评论 -
javascript 属性检测
// 测试数据定义let symbolKey = Symbol('symbolKey');function Obj(){ this.ownKey = 1; this[symbolKey] = 2;}Obj.prototype.prototypeKey = 3;let o = new Obj();Object.defineProperty(o, 'unenumerableKey', { enumerable: false, value: 4})in 本地属性或继承属性'ownK原创 2020-10-26 11:48:20 · 131 阅读 · 0 评论 -
Array.prototype 的 keys(),values(),entries() 方法
均返回一个迭代器数组(Array Iterator),其中,keys() 返回的内容是键,values() 返回的内容是值,entries() 返回的内容是键值对用法let l = [1,2,3,4]// keys()for(let key of l.keys()){ console.log(key);}// 0 1 2 3// values()for(let value of l.values()){ console.log(value);}// 1 2 3 4// entrie.原创 2020-10-26 10:56:03 · 234 阅读 · 0 评论