作者:ManfredHu
链接:http://www.manfredhu.com/2016/07/07/20-interestingJavascript
声明:版权所有,转载请保留本段信息,否则请不要转载

1.声明提升

写出下面代码的运行结果

  1. var a,b;
  2. (function(){
  3. console.log(a);
  4. console.log(b);
  5. var a=b=3;
  6. console.log(a);
  7. console.log(b);
  8. })();
  9. console.log(a);
  10. console.log(b);

A. undefined,undefined,3,3,undefined,3
B. undefined,undefined,3,3,undefined,undefined
C. 0,0,3,3,undefined,undefined
D. undefined,undefined,3,3,0,0

正确答案:A
解释:代码相当于下面这样的过程

  1. var a,b;
  2. (function(){
  3. var a;
  4. console.log(a); //undefined
  5. console.log(b); //undefined
  6. a=3;
  7. b=3;
  8. console.log(a); //3
  9. console.log(b); //3
  10. })();
  11. console.log(a); //undefined
  12. console.log(b); //3

2.变量定义规则

下面符合一个有效的javascript变量定义规则的是?

A. _

t2
B. with
C. a bc
D. 2a

正确答案: A
考点:ECMAScript语法
解析:with为关键字,空格不行,数字开头的不行

3.document.getElementById和document.getElementsByTagName

JavaScript中document.getElementById的返回值的类型和document.getElementsByTagName的返回值类型分别是?

A. Array,NodeList
B. Object, HTMLCollection
C. String,NodeList
D. Function,NodeList

正确答案: B
解析:这题可能有争议,浏览器测试代码如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Id与TagName类型检测</title>
  6. </head>
  7. <body>
  8. <div id="test"></div>
  9. <script type="text/javascript">
  10. function checkType(element){
  11. console.log(Object.prototype.toString.call(element));
  12. }
  13. checkType(document.getElementById('test')); //[object HTMLDivElement]
  14. checkType(document.getElementsByTagName('div')); //[object HTMLCollection]
  15. </script>
  16. </body>
  17. </html>

4.if/var

下面关于块内函数的做法哪些是正确的?
A. if(x){ function foo(){}}
B. if(x){ var function foo(){}}
C. if(x){ foo = function(){}}
D. ECMAScript明确的规范了块级函数,JavaScript实现了这个规范

正确答案:B
解析:测试报错

5.hasOwnProperty

下列代码

  1. var obj={}
  2. ……
  3. obj.hasOwnProperty("val");

中hasOwnProperty的作用是?
A. 判断obj对象是否具有val的属性
B. 判断obj对象是否具有val的值
C. 判断obj的原型对象是否具有val的属性
D. 判断obj的原型对象是否具有val的值

正确答案:A
解析:hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false

6.call和apply

下面有关JavaScript中 call和apply的描述,错误的是?

A. call和apply都属于Function.prototype的方法,所以每个function实例都有call,apply属性
B. 两者传递的参数不一样,call函数第一个参数都是传入给当前对象的对象,apply不是
C. apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入
D. call传入的则是直接的参数列表。call方法可将一个函数的对象上下问从出事的上下文改变为thisObj指定的新对象。

正确答案:B
解析:applycall都是改变函数内部this指向的方法,挂载在Function.prototype

7.script标签

(不定项选择题)给网页添加javascript的方式有

  1. A. 使用script标签,将JavaScript代码写到<script></script>之间
  2. B. 添加外部javascript文件
  3. C. 使用行内javascript
  4. D. 使用@import引入javascript文件

正确答案:A,B,C
解析:只有CSS可以用@import方法,题目其实可以换成CSS,则全部正确

  1. 给网页添加css的方式有
  2. A. 使用style标签,将JavaScript代码写到<style></style>之间
  3. B. 添加外部css文件
  4. C. 使用行内css
  5. D. 使用@import引入css文件

8.parseInt与map

[“1”, “2”, “3”].map(parseInt)的输出结果是
A. [1,NaN,NaN]
B. [1,2,3]
C. [NaN,NaN,NaN]
D. 发生错误

正确答案: A. [1,NaN,NaN]
解析:

  • Array.prototype.map(func(currentValue, index, arrary),thisObj)
    map接受两个参数, 一个回调函数 callback, 一个回调函数的this值。其中回调函数接受三个参数 currentValue, index, arrary
  • parseInt 只接受两个两个参数 string, radix(基数).基数。该值介于 2 ~ 36 之间,如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。如果为0,则直接输出字符串

如下的例子来看this的运用和基数的例子:

  1. var obj = {
  2. value:1
  3. };
  4. ["1", "2", "3"].map(function(currentValue, index, arrary){
  5. console.log(this); //输出3次obj
  6. },obj);
  7. console.log(parseInt('1', 0)); //1
  8. console.log(parseInt('123', 0)); //123
  9. console.log(parseInt('2', 1)); //NaN
  10. console.log(parseInt('3', 2)); //NaN

["1", "2", "3"].map(parseInt)的时候,传入parseInt的参数为currentValue,index

9.Function.prototype.name

  1. function foo() { }
  2. var oldName = foo.name;
  3. foo.name = "bar";
  4. console.log([oldName, foo.name]);

A. [‘foo’,’bar’]
B. [‘foo’,’foo’]
C. [‘bar’,’bar’]
D. [‘bar’,’foo’]

答案:B.[‘foo’,’foo’];

函数的name属性指向函数名,挂载在Function.prototype下,所以不要给函数赋值属性name哈。并且这个属性是不可改变的.

所以下面这样的例子就不要出现了

  1. function foo() {}
  2. foo.name = "bar"; //bad,你居然真忘了Function.prototype.name是一个不可修改的属性!!

测试代码:

  1. console.log(Function.prototype.hasOwnProperty('name')); //true

10.正则test方法的参数问题

  1. var lowerCaseOnly = /^[a-z]+$/;
  2. [lowerCaseOnly.test(null), lowerCaseOnly.test()]

A. false, true
B. false,true
C. true,true
D. true,false
答案: C.true, true

如题所示,test方法如果参数为null或者不屑,则默认返回true

11.变量作用域

写出这段代码的运行结果

  1. <SCRIPT type="text/javascript">
  2. var bb = 1;
  3. function aa(bb) {
  4. bb = 2;
  5. console.log(bb);
  6. };
  7. aa(bb);
  8. console.log(bb);
  9. </SCRIPT>

正确答案: 2 1

12.+-操作符

如下代码输出的结果是什么:

  1. console.log(1+ "2"+"2");
  2. console.log(1+ +"2"+"2");
  3. console.log("A"- "B"+"2");
  4. console.log("A"- "B"+2);

正确答案:
122 //数字与字符串+则数字默认转换为字符串
32 //+号会将字符串2先转化为数字,这种也是常用的将字符串转换为数字的方式
NaN 2
NaN

解析:插播——常见的将字符串转换为数字的方法:

  1. parseInt,具体使用请看前面第8题
  2. +"123" 类似这种写法,比如某个参数不确定是不是数字可以这样 +data.len
  3. Number方法

从带宽(精简压缩后)考虑会用第二种,所以通常会在代码上大量看到这种写法

13.null和Object的关系

[typeof null, null instanceof Object]的输出结果是

正确答案:object, false
解析:
null为一个空的对象,这个对象存在但是里面一点东西都没有,相当于有堆空间但是里面没有属性。而undefined可以理解为连堆空间都没有(至少表现出来是这样的不是吗?)
null instanceof Objectfalse是因为null连属性都没有,更没有检测原型链的_proto_prototype了。

14.+运算符优先于?:运算符

var val = ‘smtg’;
console.log(‘Value is ’ + (val === ‘smtg’) ? ‘Something’ : ‘Nothing’);
正确答案: ‘Something’

15.变量作用域

  1. 写出下面代码的执行效果
  2. var name = 'World!';
  3. (function () {
  4. if (typeof name === 'undefined') {
  5. var name = 'Jack';
  6. console.log('Goodbye ' + name);
  7. } else {
  8. console.log('Hello ' + name);
  9. }
  10. })();

正确答案: Goodbye Jack

编译语法分析后代码(声明提升)如下

  1. var name = 'World!';
  2. (function () {
  3. var name;
  4. if (typeof name === 'undefined') {
  5. name = 'Jack';
  6. console.log('Goodbye ' + name); //Goodbye Jack
  7. } else {
  8. console.log('Hello ' + name);
  9. }
  10. })();

16.

写出下面题的答案

  1. var END = Math.pow(2, 53);
  2. var START = END - 100;
  3. var count = 0;
  4. for (var i = START; i <= END; i++) {
  5. count++;
  6. }
  7. console.log(count);

正确答案:不会输出,因为END是最大值了,
解析:在 JS 里, Math.pow(2, 53) == 9007199254740992 是可以表示的最大值. 最大值加一还是最大值. 所以循环不会停

17.浮点数的不准确性

输出0.1+0.2 === 0.3的结果,并简单地解释。
解析:经典的题目,浮点数因为存在误差,所以不能用===判定,通常在金额处理的时候会乘以10/100倍来小数部分的数据

18.正则表达式replace的高级用法

写出答案

  1. "1 2 3".replace(/\d/g, parseInt)

答案:1, NaN, 3
解析:replace() 方法的参数第二个参数可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。

1.该函数的第一个参数是匹配模式的字符串
2.接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数
3.接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置
4.最后一个参数是 stringObject 本身。

题目中因为没有子表达式匹配,即()括起来的匹配项,所以传入parseInt的参数三次分别为:

  1. parseInt("1", 0) //1,因为当基数为0时候直接输出第一个参数
  2. parseInt("2",2) //NaN,因为2进制只有01两个数字
  3. parseInt("3",4) //3,因为不超过四进制的最大值4

19.getPrototypeOf根据proto获取类型

  1. function f() {}
  2. var a = f.prototype, b = Object.getPrototypeOf(f);
  3. console.log(a === b);

答案:false
解析如下:

  1. function f() {}
  2. var a = f.prototype; //Object
  3. var c = new f();
  4. var b = Object.getPrototypeOf(f); //function
  5. var d = Object.getPrototypeOf(c); //Obejct
  6. console.log(a === b); //false
  7. console.log(d === a); //true

函数的原型是一个对象,而函数的原型会是函数,对象的原型会是对象
题目这里就是让你混淆普通函数的原型到底是什么?函数还是对象?
答案是函数,因为普通函数的_proto_指向的是Function.prototype,所以Object.getPrototypeOf拿到的是function

你可以狠狠戳这里去看我以前写的15条规则解析JavaScript对象布局

这里应该可以看的很清楚了,函数FooprototypeFoo.prototype
Object.getPrototypeOf拿的是_proto_指向的Function.prototype,所以输出的是一个function
而普通对象,如图的o1,o2_proto_指向的是Object.prototype

20.[,]和join

  1. [,,,].join(", ")

答案: “, , ”
解析:

  1. [,,,].lenth //3
  2. [,,,].join('-') //--

所以这题很明显了,三个逗号默认忽略最后一个,然后用’-‘会在两项中间添加连接符

21.Function.length和new Function.length

  1. var a = Function.length,
  2. b = new Function(1,'2234').length;
  3. console.log(a === b);

答案 false
解析:a为1,b为0,不相等

22.Math.min()和Math.max()在没有参数时候的奇葩情况

  1. var min = Math.min(), max = Math.max()
  2. min < max

答案;false
解析:min为Infinity,b为-Infinity,结果是min > max

min() 方法可返回指定的数字中带有最低值的数字。
Math.min(x,y) 如果没有参数,则返回 Infinity。如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。

max() 方法可返回两个指定的数中带有较大的值的那个数。
Math.max(x…) 如果没有参数,则返回 -Infinity。如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。

23.闭包

  1. function aa() {
  2. console.log("aaa");
  3. return function(){
  4. console.log("bbb");
  5. };
  6. }
  7. console.log(aa);
  8. console.log(aa());
  9. console.log(aa()());

答案:

  1. function aa() {
  2. console.log("aaa");
  3. return function(){console.log("bbb");};
  4. }
  5. aaa
  6. function(){console.log("bbb");};
  7. aaa
  8. bbb
  9. undefined

第一个输出aa的函数体,大家都懂
第二个执行了aa(),输出文本"aaa",同时返回了里面的匿名函数
第三个在第二步的基础上执行了匿名函数,最后再输出一个bbb,最后因为执行函数没有返回值,返回了undefined

24.类数组(array like)

类数组对象是什么?说一下你知道的JavaScript里面类数组对象有哪些,类数组怎么转化为数组?

类数组: 指向对象元素的数字索引下标以及 length 属性告诉我们对象的元素个数,但是不具有诸如 pushforEach 以及 indexOf 等数组对象具有的方法
常见例子: DOM方法 document.getElementsByClassName() 的返回结果(实际上许多DOM方法的返回值都是类数组)以及特殊变量 arguments

所以通常要有一个转换的过程,借助 Array.prototype.slice 可以实现:

  1. Array.prototype.slice.call(arguments) //arguments转化为普通数组

25.构造函数与静态方法

写出下面代码输出的结果并写出你的解题思路?

  1. function Foo() {
  2. getName = function () { console.log (1); };
  3. return this;
  4. }
  5. Foo.getName = function () { console.log (2);};
  6. Foo.prototype.getName = function () { console.log (3);};
  7. var getName = function () { console.log (4);};
  8. function getName() { console.log (5);}
  9. //请写出以下输出结果:
  10. Foo.getName();
  11. getName();
  12. Foo().getName();
  13. getName();
  14. new Foo.getName();
  15. new Foo().getName();
  16. new new Foo().getName();

答案:

  1. Foo.getName();//2
  2. getName();//4
  3. Foo().getName();//1
  4. getName();//1
  5. new Foo.getName();//2
  6. new Foo().getName();//3
  7. new new Foo().getName();//3

26.典型闭包

下面代码的运行结果是?

  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>DOM进阶</title>
  5. <script type="text/javascript">
  6. window.onload=function(){
  7. var buttons=document.getElementsByName('button1');
  8. for(var i=0;i<buttons.length;i++){
  9. buttons[i].onclick=function(){
  10. console.log(i);
  11. };
  12. }
  13. };
  14. </script>
  15. </head>
  16. <body >
  17. <input type="button" name="button1" value="按钮1" />
  18. <input type="button" name="button1" value="按钮2" />
  19. <input type="button" name="button1" value="按钮3" />
  20. <input type="button" name="button1" value="按钮4" />
  21. <input type="button" name="button1" value="按钮5" />
  22. </body>
  23. </html>

这个错新手估计会犯,当初的我也是。
闭包,点那个按钮都是输出 buttons.length 的值,这里是5

Interesting JavaScript的更多相关文章

  1. javascript正则表达式(二)——方法

    正则表达式规则见:http://www.cnblogs.com/wishyouhappy/p/3756812.html,下面说明相关方法 String相关方法 概括: search() replace ...

  2. 【JavaScript】js 中一些需要注意的问题

    关于js中逻辑运算符 sort()方法 1. 关于js中逻辑运算符:|| 和 && 在js逻辑运算中,0."".null.false.undefined.NaN都会 ...

  3. 【前端】Vue.js实现网格列表布局转换

    网格列表布局转换 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>布局转换</title& ...

  4. 【前端】Vue.js实现实例搜索应用

    实例搜索应用 实现效果: 实现代码与注释: <!DOCTYPE html> <html> <head> <title>实例搜索</title> ...

  5. Vue.js小案例(2)

    即时搜索 这个例子主要应用了vue.js的自定义过滤器,可以通过Vue.filter()注册一个全局过滤器,具体用法可以参考这里,vue.js也提供了一些内置过滤器. CSS代码: [v-cloak] ...

  6. 一些有趣的Javascript技巧

    整理一些刷题时学会的小技巧…… 目录: 即大于0又小于0的变量 String.split() 与 正则表达式 缓存的几种方法 初始化一个数组 即大于0又小于0的变量 问题: 设计一个变量val,使得以 ...

  7. JavaScript编码规范指南

    前言 本文摘自Google JavaScript编码规范指南,截取了其中比较容易理解与遵循的点作为团队的JavaScript编码规范. JavaScript 语言规范 变量 声明变量必须加上 var  ...

  8. ios之JavaScript

    初次接触java脚本,感觉java脚本so interesting!为什么呢?写javascript代码感觉就像是在记流水账,无拐弯抹角,一个字,就是"干",想怎么干就怎么干,哈哈 ...

  9. JavaScript Patterns 5.3 Private Properties and Methods

    All object members are public in JavaScript. var myobj = { myprop : 1, getProp : function() { return ...

随机推荐

  1. iOS 11 scroll滚动偏移,tableview偏移44,获取view的宽和高

    1. tableview 的头部 有44的偏移量 1>.设置 tableview的 属性 tableView.scrollIndicatorInsets = UIEdgeInsets.zero ...

  2. PAT 1052 卖个萌 (20)(代码+思路)

    1052 卖个萌 (20)(20 分) 萌萌哒表情符号通常由"手"."眼"."口"三个主要部分组成.简单起见,我们假设一个表情符号是按下列格 ...

  3. makefile all

    all:udps udpc udps:udpserv.c    gcc -Wall -o udps udpserv.cudpc:udpclient.c    gcc -Wall -o udpc udp ...

  4. [SoapUI] Datasink怎么显示每次循环的结果

    https://www.soapui.org/reporting/the-report-datasink.html

  5. Jmeter的一个jmx文件(备忘)

    <?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1. ...

  6. predict_proba 的使用

  7. sql join用法(转)

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  8. python面向对象-2深入类的属性

    在交互式环境中输入: >>> class A: a=0 def __init__(self): self.a=10 self.b=100 >>> a=A() > ...

  9. spring boot使用java读取配置文件,DateSource测试,BomCP测试,AnnotationConfigApplicationContext的DataSource注入

    一.配置注解读取配置文件         (1)@PropertySource可以指定读取的配置文件,通过@Value注解获取值   实例:           @PropertySource(val ...

  10. 分享一个以前写的基于C#语言操作数据库的小框架

    一:前言 这个是以前写的操作MySQL数据库的小型框架,如果是中小型项目用起来也是很不错的,里面提供Filter.ModelPart.Relationship等机制实现操作数据库时的SQL语句的拼接和 ...