从上面的代码我们可以看到toString是可依赖的,不管是object类型还是primitive类型,它都能告诉我们正确的结果。...但它只可以用于判断内置的数据类型,对于我们自己构造的对象,它还是不能给出我们想要的结果,比如下面的代码: function Person() { } var a = new Person(); // [...ToPrimitive 当我们需要将变量转换为原始类型时,就需要用到ToPrimitive,下面的代码说明了ToPrimitive的内部实现原理: // ECMA-262, section 9.1, page...下面来个实例,({}) + 1(将{}放在括号中是为了内核将其认为一个代码块)会输出啥?可能日常写代码并不会这样写,不过网上出过类似的面试题。...'); } 你觉得会不会输出something呢,答案是会的,所以这也是为什么很多代码规范推荐使用===三等了。
结果两个情况的输出结果都是代码块里面的第一个,咦,好像和之前所学的变量提升有点不一样。我们下面开始探究一下 本文基于chrome展开研究。...是没有块级作用域的,所以下面代码输出了2 var a = 1; { var a = 2; }; console.log(a); // 2 复制代码 而let、const是有块级作用域的,如下输出了1...但是打点看一下,有点不一样——第一个点Global里面的a为什么不是函数而是undefined // 开始打点 debugger; // Global => a: undefined { debugger...第一个点Global里面的a为什么不是函数而是undefined,第三个点Global的a为什么是undefined而不是1,而且要在function a(){}后面才开始赋值1?...具体为什么呢,大概是浏览器的内部对代码块的实现方式了 只有第一次a函数声明会“传递”,后面的a函数声明只会把上一句赋值语句(a = xxx)的值“传递”到全局 我们可以试一下,利用这些规律猜一下输出结果
所以上面等价下面的代码: function arrayFromValue(item) { return; [items]; } arrayFromValue(10); // => undefined...return;在函数内部使该函数返回 undefined,所以 arrayFromValue(10) 的值为 undefined。...被考烂的一个经典闭包问题 面试官问 下面的代码执行结果是什么?...这就是为什么控制台输出为 3, 3 和 3 的原因 其实还有一种解释,就是计算机执行一条语句基本都是纳秒级别的,所以执行一个简单循环根本花费不了多少,当 100 毫秒后,for 早就跑完了,变量 i 已经是退出循环的条件值...浮点运算 面试官问 下面的代码输出是什么? (能不能换个题) 0.1 + 0.2 === 0.3 // => ???
cookie会在请求头中一起发送给服务器,另外两个则不参与通信 2、判断以下js代码是否正确,并描述原因 A "undefined" == undefined B "8889" == 8889 A的结果是...3、请问以下代码最终输出结果是什么 (function () { var a = b = 345; })(); console.log(b); console.log(typeof(a)); 输出结果...345,undefined,a是通过var关键字进行生命,属于函数内部的局部作用域,而b被分配到全局作用域,所以在后边可以访问到b的值。...如果在函数内部使用了严格模式的话,代码会在输出b的时候报错Uncaught ReferenceError: b is not defined 4、请用javascript将字符串"http://www.alipay.com...问题大概有下面这些: 为什么选择使用React 数组遍历的区别(for、for...in、for...of、forEach、Map) 使用Symbol.iterator可以为对象添加可迭代属性
(123); }; // 这种写法,chrome下可以不加分号,一些其他的浏览器(safari)需要加分号否则报错 // 为了稳妥,所以还是加分号吧 块级作用域 对于var是没有块级作用域的,所以下面代码输出了...但是打点看一下,有点不一样——第一个点Global里面的a为什么不是函数而是undefined // 开始打点 debugger; // Global => a: undefined { debugger...第一个点Global里面的a为什么不是函数而是undefined,第三个点Global的a为什么是undefined而不是1,而且要在function a(){}后面才开始赋值1?...这个题目答案的表现就是,代码块里面先声明什么,最终a的结果就是什么。问题转化成为:为什么外层的a是代码块的第一个声明的a?...具体为什么呢,大概是浏览器的内部对代码块的实现方式了 只有第一次a函数声明会“传递”,后面的a函数声明只会把上一句赋值语句(a = xxx)的值“传递”到全局 我们可以试一下,利用这些规律猜一下输出结果
[TypeScript] 前言 接口是我们在进行模块、方法等的封装时经常会用到的一个概念,使用接口可以: 将一类具体事务抽象成单一的对象方法,使用者不必关心内部的实现逻辑,只需要按照要求传入对应的参数即可得到预期的结果输出...read properties of undefined (reading 'name') 由于 JavaScript 没有静态类型检查机制,在代码真正运行前无法准确判断可能会出现的问题。...经常在调用一个接口前,还需要研究一下这个接口相关的源码,这很不利于协同开发。 我们迫切需要一种能够在方法调用时明确显示所需参数类型及格式的机制。...为什么要用 TypeScript 接口? 上面两段代码暴露出两个问题: 没有类型检查器的机制不利于协同开发; 常规的 TypeScript 类型检查器写法容易造成代码冗余。...并且还引出了一个疑惑点,大家可以就这个问题给出自己的见解,欢迎在评论区交流! ~ ~ 本文完,感谢阅读! ~ 学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
> 执行期 会按照代码块的顺序筑行执行 正因为从外部访问在函数内部进行声明的局部变量是不可能的,所以出现了闭包这种形式,在函数内部再定义一个函数。 闭包(Closure)是什么?...查阅了一些文章和资料,发现还是下面的定义最容易理解: 闭包:定义在函数内部的一个函数。 扩展一些讲,可以参考一下阮一峰的讲解: 闭包:能够读取其他函数内部变量的函数。...return f2; } var result=f1(); result(); // 999 如此段代码所示,f2()就是其中的闭包函数,通过f2()我们可以访问到f1()内部的n。...a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1); c.fun(2); c.fun(3); 看解答前先思考一下会输出什么哦...0 最后,输出结果如下 var a = fun(0); a.fun(1); a.fun(2); a.fun(3); undefined 0 0 0 搞清楚第一个的过程,第二个的破解关键就在于闭包让函数内部的变量始终保存在内存之中
JS是单线程的,所以JS理论上是从上到下执行代码的,所以按理来说会报错 a is not defined。 但是,实际上在执行代码前,会先进行一次预编译,把 var变量的声明提升到前面。...所以上面的代码实际上也相当于 var a console.log(a) 变量提升只会把变量的声明提升到前面,赋值则不会提升到前面。...console.log(a) var a = 123 console.log(a) 会先输出 undefined,然后输出 123 预编译后的代码如下, var a console.log(a) a =...依次输出 f a() {}、 222、 111 为什么当到达原来的函数声明处,会把块变量赋值给外部变量? the spec says so....undefined 为什么?
再多说两句,个人理解: // 我们先来看,为什么上面的代码访问不到property属性。...console.log(scareMe.property); //输出undefined 这是为什么呢?在第一次执行scareMe()方法后,就找不到property属性了。...那么,我们再看代码: // 我们先来看,为什么上面的代码访问不到property属性。...最后,再说一下,为什么赋值给一个其它名字的变量以及用对象的方法来使用的时候,重定义永远没有发生。...全局对象是以参数方式传递给即时函数的,以便于在不使用window指定全局作用域限定的情况下可以在函数内部访问该对象,这样将使得代码在浏览器环境之外时具有更好的操作性。
其实输出的结果是doSomething。这就引出了我们的问题了,当函数声明与其他声明一起出现的时候,是以谁为准呢?答案就是,函数声明高于一切,毕竟函数是js的第一公民。 那么,下面的例子呢?...以上代码输出结果为2。 因为有多个函数声明的时候,是由最后面的函数声明来替代前面的。...原因: 在执行getData()方法的时候会在函数内部首先将变量的声明提升到第一步。 然后再声明函数内部的函数(如果函数内部有函数的话)。 之后才会按照方法内部的逻辑先后顺序执行代码。...看到这里应该就已经知道为什么会有上面那样的结果了。 实际的方法内部代码执行顺序应该是这样的: function getData(){ //一。声明变量 var data; //二。...为什么有变量提升 那么为什么会出现变量提升这个现象呢? 其实js和其他语言一样,都要经历编译和执行阶段。
其实输出的结果是doSomething。这就引出了我们的问题了,当函数声明与其他声明一起出现的时候,是以谁为准呢?答案就是,函数声明高于一切,毕竟函数是js的第一公民。 那么,下面的例子呢?...以上代码输出结果为2。 因为有多个函数声明的时候,是由最后面的函数声明来替代前面的。...之后才会按照方法内部的逻辑先后顺序执行代码。前两步只是声明!!! 看到这里应该就已经知道为什么会有上面那样的结果了。...实际的方法内部代码执行顺序应该是这样的: function getData(){ //一。声明变量 var data; //二。...为什么有变量提升 那么为什么会出现变量提升这个现象呢? 其实js和其他语言一样,都要经历编译和执行阶段。
首先分析一下这段代码的具体执行过程。...我们来分析一下这段代码到底是怎么执行的,就会明白为什么结果与我们预想的完全不同,甚至可以说很怪异。...忽略了这段语句后,等于是只输出b,也就是输出函数本身。之后,我们在全局下输出b,根据上面的说法,我们无法在NFE函数外部访问NFE的函数名,所以这里的b代表的不是函数,而是用let声明的那个变量b。...接下来再来看一下 bind() 的 polyfill 代码: bind() 实际上也是通过 apply() 实现的 —— 原理就是返回一个包装函数,这个函数在内部对初始函数完成了 this binding...这也是为什么说 bind() 是 tight binding 的原因,一旦绑定就很难再改变。 理解这一点之后,再来看上面的题就简单了。
undefined 26 为什么?...代码段的输出不是shoaib和20,结果为undefined和26,这是由于JavaScript中的吊装而导致的。...我们再将上面的代码转换一下,如下: var name = "shoaib"; var age = 26 var info = function () { var name; console.log...但是内部部分不同。 在这里,this不参考obj。这就是为什么this.name是undefined。但是对局部变量的引用self仍在范围内,并且具有适当的访问权限。...undefined shoaib 为什么?
(这就是为什么你应该在你的代码中使用strict,一个重要的例子!) 3、下面的代码将输出到控制台的是什么?,为什么?...当试图删除一个不可配置的属性时,非严格代码将自动失败,而在这种情况下,严格模式会引发错误。 6、考虑下面的两个函数。他们都会返回同样的值吗?为什么或者为什么不?...14、下面的代码将输出到控制台,为什么?...15、下面的代码将输出到控制台,为什么?...因此输出将如上所述。 28、考虑下面的代码。输出是什么,为什么?
= "local scope"; function f() { return scope; } return f; } checkscope()(); 上面两段代码的结果都输出...console.log(obj.b) // 4 console.log(a) // 2,a被当前全局变量泄露到全局作用域上了 为什么最后能输出a的值为2?...{} 里面定义的变量,只会在当前代码块有效,如果外层作用域下想访问该变量,会报引用错误异常。...函数没有方法重载,存在两个相同的函数名,后面的函数会覆盖前面的函数。...原因: 函数声明和变量声明都会被提升,但是出现在有多个“重复”声明的代码中,函数会首先被提升,然后才是变量。 相同函数名字,后面函数覆盖前面的函数。
$.isArray(bar))); 2.下面的代码将输出什么到控制台,为什么? (function(){ var a = b = 3; })(); console.log("a defined?...(还是你为什么应该理所当然地在代码中使用 use strict 的最好例子!) 3.下面的代码将输出什么到控制台,为什么?...当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。 6.考虑以下两个函数。它们会返回相同的东西吗? 为什么相同或为什么不相同?...15.下面的代码将输出什么到控制台,为什么?...这就解释了为什么,有些令人奇怪的是, 1 && 2返回 2(而不是你以为的可能返回 true 或 1)。 20.执行下面的代码时将输出什么?请解释。
先来看看下面的代码: var str="hello world"; function testVar(){ var str="hello"; } testVar(); console.log...;而在他的内部块中的变量,比如说这个函数里面的str,他其实也是优先使用块内的str变量,会屏蔽掉外面的str变量,这是一点。...这里也可以访问到test } 可能你会感到奇怪,我的var 申明的变量在if 代码块里面,为什么我的else里面也能访问呢,其实上面这段代码相当于下面这段代码 function variableHoisting..."10" 十次 }); 可能你想的是输出0,1,2,3,4,5,6,7,8,9但是这不是正确答案,这只能输出10个10,为什么呢?...下面我们就来引入一下let,以及const。
; } 此时你猜想一下doStuff函数的返回值的类型,是BasicPrimitive | undefined ?...结果和你想的可能不一样,如下图所示: 那为什么会这样? 好吧,这与TypeScript如何在内部表示类型有关。...result:' + a.customMethod()); // customMethod result: 2 使用--explainFiles了解您的项目结构 使用以下指令时,TypeScript编译器将给出一些非常长的输出...在strictNullChecks: true下,以下代码现在将会报错。...'number'. // Type 'undefined' is not assignable to type 'number'. (2322) 然而上面的代码在4.2中是可以通过编译的
== 'undefined')); 这跟变量作用域有关,输出换成下面的: console.log(b); //3console,log(typeof a); //undefined 拆解一下自执行函数中的变量赋值...3、下面的代码会在 console 输出神马?为什么?...10、在下面的代码中,数字 1-4 会以什么顺序输出?为什么会这样输出?...2、给出一种符合预期的实现方式 答:1、点击5个按钮中的任意一个,都是输出5 14、下面的代码会输出什么?为什么?...你运行下就知道了,可能会在你的意料之外。 reverse() 会改变数组本身,并返回原数组的引用。 15、下面的代码会输出什么?为什么?
领取专属 10元无门槛券
手把手带您无忧上云