== node && parent.contains(node) } : function (parent, node) { // 当node节点存在,就把node的父节点赋值给node...那转化后得到的是0 如果输入是类似字符串'123aaa',那转化后得到的是NaN 所以再结合下面的判断 通过val !...= null排除掉null和undefined 通过type != 'boolean'排除掉,true和false 通过isFinite(num)限定必须是一个有限数值 通过!...isNaN(num)排除掉被Number(val)转化为NaN的值 (type !...$.type = type 结尾 Zepto大部分工具方法或者说静态方法就是这些了,欢迎大家指正其中的错误和问题。
所以,在js中与对String和Number类型的操作类似,我们可以把函数存入一个变量等方式进行传递。 那么,当一门语言允许函数作为任何其他数据类型使用时,函数就被称为“一等公民”。...} 值得注意的是:inner函数在outer函数外部是不可见的!...当innerFn被返回时, js执行引擎将innerFn作为一个闭包,并相应地设置它的作用域。 //2、返回函数的引用存储在closureFn中。...当closureFn通过作用域链被调用时就记住了arg、outer值! closureFn();//输出: visible 5 抽象 高阶函数通常用在能够抽象通用的问题。...//1、当initivalValue未定义时,我们从第二个元素开始循环数组,将它作为累加器的初始值。
因为在JavaScript中,变量本身并没有类型,它们可以持有任何类型的值。 对大多数对象使用typeof时,返回的结果是'object',对于函数则返回'function'。...对象转换为字符串: 当一个对象需要被隐式转换为字符串时,JavaScript会尝试调用对象的toString()方法。toString()方法是一个内置方法,它返回表示对象的字符串形式。...对象转换为数字: 当一个对象需要被隐式转换为数字时,JavaScript会尝试调用对象的valueOf()方法。valueOf()方法是一个内置方法,它返回表示对象的原始数值形式。...NaN(Not a Number):当涉及无法进行有效数值计算的情况时,JavaScript会返回NaN。NaN是一个特殊的数字值,表示不是一个有效的数字。...了解这些规则和注意事项可以帮助我们 更好地理解类型转换的行为,并在编写代码时避免潜在的错误和意外结果。同时,在进行类型转换时,要根据具体的需求选择合适的方法和操作符,并进行适当的错误处理和边界检查。
NaN 指“不是一个数字”(not a number),NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败后返回的结果...typeof NaN; // "number"NaN 是一个特殊值,它和自身不相等,是唯一一个非自反(自反,reflexive,即 x === x 不成立)的值。而 NaN !...如何解决?问题描述: 两个块级元素的上外边距和下外边距可能会合并(折叠)为一个外边距,其大小会取其中外边距值大的那个,这种行为就是外边距折叠。...渲染树的节点被称为渲染对象,渲染对象是一个包含有颜色和大小等属性的矩形,渲染对象和 DOM 元素相对应,但这种对应关系不是一对一的,不可见的 DOM 元素不会被插入渲染树。...应该有面试官问过你:什么是闭包?闭包有哪些实际运用场景?闭包是如何产生的?闭包产生的变量如何被回收?这些问题其实都可以被看作是同一个问题,那就是面试官在问你:你对JS闭包了解多少?
有些人从小就享受解决复杂的数学问题,而另一些人则在学校被迫学习乘法表和长除法时对数学产生了厌恶。尽管如此,数学仍是生活中不可或缺的组成部分。无论我们处在哪里,数学的应用在我们生活中随处可见。...无论是整数还是浮点数,JavaScript 都将其视为单一的类型。这样的设计使得数字的处理变得更为简单和一致。我们先来看看如何在 JavaScript 中声明和初始化数字变量。...NaN(Not a Number):当某些数学运算无法产生有效数字时,结果将返回 NaN。例如,0 除以 0 或对负数取平方根都将返回 NaN。...); // 输出 NaN Infinity:在 JavaScript 中,当数值超出可表示的范围时,结果将返回 Infinity。...输出 20 console.log(y); // 输出 30 2.4 小数运算 在进行小数运算时,JavaScript 会自动处理精度问题,但需要注意的是,浮点数的计算可能会产生精度误差: let c
其中NaN类型是js中唯一不等于自身的类型,当发生未定义的数学操作的时候,就会返回NaN,如:1+'asdf'、Number('asdf')。浮点数的运算可能会出现如0.1 + 0.2 !...当发生引用类型强制转基本类型的操作时,就会触发内置的Symbol.toPrimitive函数,当然也可以给对象手动添加Symbol.toPrimitive函数来覆盖默认的强制类型转换行为。...直到后来看了kyle大佬的《你不知道的javascript》上册关于闭包的定义,我才豁然开朗: 当函数能够记住并访问所在的词法作用域时,就产生了闭包。...正常情况下count和所在的执行上下文会在函数执行结束时被销毁,但是由于count还在被外部环境使用,所以在函数执行结束时count和所在的执行上下文不会被销毁,这就产生了闭包。...原型和原型链 js 中的几乎所有对象都有一个特殊的[[Prototype]]内置属性,用来指定对象的原型对象,这个属性实质上是对其他对象的引用。
,改变了会成为函数内部的局部变量,调用函数时,声明变量并赋值,随着函数执行完毕,该变量会被立即销毁,无法再次访问: function func() { var message = "hometown...undefined undefined只有一个特殊值undefined,当声明了一个变量,未对其进行初始化时,默认为undefined。...Number传入对象时,会调用对象的valueOf方法parseInt() + parseInt(true) ---> NaN + parseInt(false) ---> NaN + parseInt...,并且是唯一的、不可变的。...因此默认在所有函数和类上都可以调用。
原始类型的不可变性 在回答这个问题之前,我们先看一下变量在内存中是如何存储的: let name1 = 'bubuzou' let name2 = name1.concat('.com') console.log...原始类型进行复制的时候是变量的值进行重新赋值,而如上图所示:引用类型进行复制的时候是把变量所指向的引用地址进行赋值给新的变量,所以复制后 person1 和 person2 都指向堆内存中的同一个值,所以当改变...,所以全局的 person 和函数内部的局部变量 person 是指向同一个堆地址的,所以一旦一方改变,另一方也将被改变,所以至此我们是不是可以下结论说:当函数进行传参的时候如果参数是引用类型那么就是引用传递嘛...,就不会存在这个问题了,因为它是唯一标识符,所以可以使对象的属性受到保护,不会被意外的访问或者重写。...号不是写错了,而是必须是2个,否则会报 SyntaxError 错误。第一个点表示小数点,第二个才是调用方法。
因为当我们打印 name 变量时还没有执行到定义变量的位置,因此变量的值保持为 undefined。 通过 let 和 const 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。...在第二个遍历中,遍历 i 是通过 let 关键字声明的:通过 let 和 const 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。...如果这样做,它将抛出一个ReferenceError:1和4将引发一个引用错误。 使用super关键字,需要用给定的参数来调用父类的构造函数。...Object.keys方法返回对象上的所有可枚举的键属性。Symbol类型是不可见的,并返回一个空数组。记录整个对象时,所有属性都是可见的,甚至是不可枚举的属性。...这是Symbol的众多特性之一:除了表示完全唯一的值(防止对象意外名称冲突,例如当使用2个想要向同一对象添加属性的库时),您还可以隐藏这种方式对象的属性(尽管不完全。
I 变量的声明 变量是存储值的容器,在 JavaScript 中声明一个新变量的方法是使用关键字let 、const 和 var,let 和 const 关键字允许你创建块作用域的变量。...JavaScript 中可以定义重名变量,如果后面定义的变量没有初始化则会按照前面定义的输出 。 如果声明了一个变量却没有对其赋值,那么这个变量的类型就是 undefined。...let a; let name = 'Simon'; let x,y,z=3;//只有最后一个变量z 被赋值了3 //给多个变量赋值 //Longhand let a, b, c; a = 5; b...() 来判断一个变量是否为 NaN: isNaN(NaN); // true 内置的 Error(错误)类型 特殊值:Infinity(正无穷)和 -Infinity(负无穷) //使用内置函数 isFinite...document.querySelector 和 alert 是浏览器内置的函数,随时可用。
JavaScript数据类型浅析最近在复习JS的基础知识,发现自己对BigInt与Number的理解不是很深刻,对NaN的理解也不到位,于是打算写一篇文章详细讲解一下。...null 得到检测错误是历史遗留问题,在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象然而 null 表示为全零,所以将它错误的判断为 object...字符串也可以是一个对象日期是一个对象数学和正则表达式也是对象数组是一个对象甚至函数也可以是对象let x1 = {}let x2 = new Object()// 基本类型的包装类 使用typeof判为...,并由函数返回,函数拥有属性函数总有返回值(换句话说就是有return语句,当然构造器函数除外,因为它默认会返回构造器函数调用,当构造函数的调用执行时,会显示的返回返回)var funA = function...// 普通函数的调用funB[0](); // 函数存入数组中的调用funC.method(); // 对象调用方法的使用⭐以上就是本文的全部内容啦,如果对你有帮助请给我点个赞吧
对象 调用 ToPrimitive( value,number) 并转换成原始类型 在数字里面有4个特殊的数值: 2个错误值:NaN 和 Infinity 2个0,一个+0,一个-0。...typeof NaN <"number" (吐槽:NaN 是 “ not a number ”的缩写,但是它却是一个数字) NaN 是 JS 中唯一一个不能自身严格相等的值: NaN === NaN 函数不是专门用来判断Infinity的,是用来判断一个值是否是错误值(这里表示既不是 NaN,又不是 Infinity,排除掉这两个错误值)。...这就说明了函数提升是优先于变量提升的。 为了避免变量提升,ES6中引入了 let 和 const 关键字,使用这两个关键字就不会有变量提升了。...看上去是在调用 obj[add],实际上是在调用17[25]。 还有一个问题,使用 arguments 引用的时候。
NaN number JavaScript 中的数字类型是所有数字值的集合,包括 “Not A Number”,正无穷和负无穷。...NaN 可用于表示错误的数字运算。...调用 getFontSize({ size: 16 }) 时,结果是undefined(在 { size: 16 } 对象中不存在 fontSize 属性)。...fontSize * 2 被评估为 undefined * 2,结果为 NaN。 当把缺少的属性或返回 undefined 的函数用作算术运算中的值时,将生成 “Not A Number”。...3 NaN 作为操作数 当算数运算的操作数为 NaN 时,也会生成NaN 值: 1 + NaN; // => NaN 2 * NaN; // => NaN NaN 遍及算术运算: let invalidNumber
在 array 的函数调用的时候是会跳过这些'坑'的....当它作为函数调用时,它返回当前时间的字符串表示形式。...面试的时候,问你这个问题,要是回答错误的话,估计面试官对基础很是怀疑!!! 问你这个题目的时候,你可以牵扯出很多问题,比如JS如何存储小数的呢?...根据MDN上对argument有更加准确的定义,看argument 当非严格模式中的函数有包含剩余参数、默认参数和解构赋值,那么arguments对象中的值不会跟踪参数的值(反之亦然)。...Number.isFinite()检测有穷性的值,唯一和全局isFinite()函数相比,这个方法不会强制将一个非数值的参数转换成数值,这就意味着,只有数值类型的值,且是有穷的(finite),才返回
对象 调用 ToPrimitive( value,number) 并转换成原始类型 在数字里面有4个特殊的数值: 2个错误值:NaN 和 Infinity 2个0,一个+0,一个-0。...typeof NaN <"number"复制代码 (吐槽:NaN 是 “ not a number ”的缩写,但是它却是一个数字) NaN 是 JS 中唯一一个不能自身严格相等的值: NaN === NaN...但是 isFinite() 函数不是专门用来判断Infinity的,是用来判断一个值是否是错误值(这里表示既不是 NaN,又不是 Infinity,排除掉这两个错误值)。...这就说明了函数提升是优先于变量提升的。 为了避免变量提升,ES6中引入了 let 和 const 关键字,使用这两个关键字就不会有变量提升了。...看上去是在调用 obj[add],实际上是在调用17[25]。 还有一个问题,使用 arguments 引用的时候。
=x来判断变量x是否为NaN,当且仅当x为NaN的时候,表达式的结果才为true。函数isNaN()的作用与此类似。..."object" 通常认为null是它自有类型的唯一成员,可以表示数字、字符串和对象是“无值”的 对undefined执行typeof操作返回什么 返回字符串"undefined" null和undefined...数组的解构赋值(ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。) 3. 字符串的拓展(模板字符串,新增includes()等方法) 4....,使得控制异步操作更加容易 缺点 无法取消 Promise,一旦新建它就会立即执行,无法中途取消 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部 当处于Pending状态时,无法得知目前进展到哪一个阶段...箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj 面试尾声 此次面试你对我们公司还有什么问题么,我可以回答你两个问题 于是我问了部门对字节跳动的效率优化案例,但面试小哥说不好透露这些东西
# const 行为与 let 基本相同,当其在声明变量时必须同时初始化变量,且不能在后期修改 const 声明的限制只适用于它指向的变量的引用 # 最佳实践 不使用 var const 优先, let...如果转换结果是NaN,则调用toString()方法,再按照字符串规则转换 parseInt() 字符串最前面的空格会被忽略,从第一个非空格字符开始,如果第一个字符不是数值字符或加减号,会立即返回NaN...,而不是被转换后的字符表示 # Symbol Symbol是原始值,且Symbol实例是唯一、不可变的。...循环时,会调用以Symbol.asyncIterator为键的函数,并期望这个函数返回一个实现迭代器API的对象。...](f)); // true 该属性定义在Function的原型上,因此默认在所有函数和类上都可以调用 Symbol.isConcatSpreadable 表示“一个布尔值,如果是true,则意味着对象应该用
}, 0); }; 执行上述代码会出现以下错误: Uncaught TypeError: undefined is not a function 上述错误的原因是,当调用 setTimeout()时,实际上是在调用...JavaScript中对块级作用域的支持是通过let关键字实现的。Let关键字已经被浏览器和Node.js等后端JavaScript引擎广泛支持了多年。...每一秒钟,当我们调用 replaceThing 时,它都会在 priorThing 中保持对先前 theThing 对象的引用。...= 会自动进行类型转换,而 === 和 !== 则相反) 另外需要注意的是:将NaN与任何东西(甚至是NaN)进行比较时结果都是 false。因此,不能使用双等运算符(==, ==, !=, !...添加一个DOM元素是一个昂贵的操作。连续添加多个DOM元素的代码是低效的。 当需要添加多个DOM元素时,一个有效的替代方法是使用 document fragments来代替,从而提高效率和性能。
next方法,实现iterator迭代器的遍历 可见结果输出是一个对象,该对象拥有done这个迭代器是否遍历完成的状态,以及当前指向项的值 看到这里,结合上述两个例子,应该知道可以通过Symbol.iterator...Set Set是ES6中新引入的数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。...[...new Set(arr)]; } unique(arr) // [1, 2, 3] 不过,要注意的是,Set判断是否重复,是使用到了全等===条件,即类型及值完全相等才摈除,不过NaN是例外...} unique(arr) // [1, 0, '', 3, false, NaN] set有一些属性和方法: Set.prototype.constructor:构造函数,默认就是Set函数。...Map Map也是ES6中新引入的数据结构,它类似于Hash结构,属于键=>值对的结构,每一项值可用key=>value来表示 通过实例化构造函数生成一个map对象,再通过.set方法设置相关项的键值对