你真的知道JS吗?

秦业
• 阅读 4733

你真的知道JavaScript吗

    JavaScript是一门奇怪的语言,要真正掌握并不容易。废话不多说,来一个快速测试,5道题目,看看你对JavaScript是否真正掌握。准备好了吗?开始咯?

题目

No.1

if (!("a" in window)) {
    var a = 1;
}

console.log(a);

No.2

var a = 1,
    b = function a(x) {
        x && a(--x);
    };
console.log(a);

No.3

function a(x) {
    return x * 2;
}
var a;
console.log(a);

No.4

function b(x, y, a) {
    arguments[2] = 10;
    console.log(a);
}
b(1, 2, 3);

No.5

function a() {
    console.log(this);
}
a.call(null);

解析

No.1

    在浏览器环境中,全局变量都是window的一个属性,即
var a = 1 等价于 window.a = 1in操作符用来判断某个属性属于某个对象,可以是对象的直接属性,也可以是通过prototype继承的属性。
    再看题目,在浏览器中,如果没有全局变量 a ,则声明一个全局变量 a (ES5没有块级作用域),并且赋值为1。很多人会认为打印的是1。非也,大家不要忘了变量声明会被前置!什么意思呢?题目也就等价于

var a;

if (!("a" in window)) {
    a = 1;
}

console.log(a);

所以其实已经声明了变量a,只不过if语句之前值是undefined,所以if语句压根不会执行。
最后答案就是 undefined

No.2

这道题有几个需要注意的地方:

  1. 变量声明、函数声明会被前置,但是函数表达式并不会,准确说类似变量声明前置,举个栗子:

console.log('b', b); // b undefined
var b = function() {}
console.log('b', b); // b function () {}

2.具名的函数表达式的名字只能在该函数内部取到,举个例子(排除老的IE?):

var foo = function bar () {}

console.log('foo', foo); 
// foo function bar(){}

console.log('bar', bar);
// Uncaught ReferenceError: bar is not defined

    综合这两点,再看题目,最后输出的内容就为 1

No.3

函数声明会覆盖变量声明,但不会覆盖变量赋值,举个栗子简单粗暴:

function foo(){
    return 1;
}
var foo;
console.log(typeof foo);    // "function"

函数声明的优先级高于变量声明的优先级,但如果该变量foo赋值了,那结果就完全不一样了:

function foo(){
    return 1;
}
var foo = 1;
console.log(typeof foo);    // "number"

变量foo赋值以后,变量赋值初始化就覆盖了函数声明。这个需要注意
再看题目

function a(x) {
    return x * 2;
}
var a;
console.log(a); // function a(x) {...}

No.4

这题考察 arguments 对象的用法(详看?JavaScript中的arguments对象)
一般情况arguments与函数参数是动态绑定关系(为什么说是一般稍后会解释),所以很好理解,最后输出的是10

但是但是但是,我们不要忘了一个特殊情况--严格模式,在严格模式中 arguments 与相当于函数参数的一个拷贝,并没有动态绑定关系,举个栗子:

'use strict'
// 严格模式!!

function b(x, y, a) {
    arguments[2] = 10;
    console.log(a);
}
b(1, 2, 3); // 3

No.5

function a() {
    console.log(this);
}
a.call(null);

关于 a.call(null); 根据ECMAScript262规范规定:
如果第一个参数传入的对象调用者是null或者undefined的话,call方法将把全局对象(浏览器上是window对象)作为this的值。所以,不管你什么时候传入null或者 undefined,其this都是全局对象window。所以,在浏览器上答案是输出 window 对象。

但是但是但是,我们依旧不能忘记一个特殊情况--严格模式,在严格模式中,null 就是 nullundefined 就是 undefined ,举个栗子:

'use strict';
// 严格模式!!

function a() {
    console.log(this);
}
a.call(null); // null
a.call(undefined); // undefined

提醒

  1. 在浏览器中的全局对象是window,Node.js中是global;

  2. 为了使代码更加严谨与健壮,建议写JS都加上严格模式'use strict';

  3. ES6已经成为前端必备技能,呼吁大家都使用ES6,方便高效,可以使用babel把ES6转成ES5甚至ES3,尽量使用ES6推动前端的发展?

About

GitHub: ?https://github.com/microzz
个人网站: ?https://microzz.com/

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Souleigh ✨ Souleigh ✨
4年前
JavaScript 是什么?
前言引用《JavaScript高级程序设计第四版》中说的话——“从简单的输入验证脚本到强大的编程语言,JavaScript 的崛起没有任何人预测到。它很简单,学会用只要几分钟;它又很复杂,掌握它要很多年。要真正学好用好 JavaScript,理解其本质、历史及局限性是非常重要的”。面试官:JavaScript 是什么?我:
Stella981 Stella981
3年前
JavaScript原型深入浅出
不学会怎么处理对象,你在JavaScript道路就就走不了多远。它们几乎是JavaScript编程语言每个方面的基础。事实上,学习如何创建对象可能是你刚开始学习的第一件事。对象是键/值对。创建对象的最常用方法是使用花括号{},并使用点表示法向对象添加属性和方法。letanimal{}animal.name
Wesley13 Wesley13
3年前
Java面试
<divclass"htmledit\_views"id"content\_views"<pid"maintoc"<strong目录</strong</p<pid"Java%E5%9F%BA%E7%A1%80%EF%BC%9Atoc"style"marginleft:40px;"<ahref"Java%E5%
Stella981 Stella981
3年前
JavaScript的 基本数据类型
第一:Javascript对象是第二:Javascript中第三:Javascript的对象是数据;第四:JavaScript中的对象可以简单理解成"名称:值"对(name:value)。名称(name):"名称"部分是一个JavaScript字符串参考https://www
Stella981 Stella981
3年前
JavaScript 非常重要的几个概念
JavaScript是一门比较复杂的语言。如果你是一名JavaScript开发人员,不管处于什么样的水平,都有必要了解JavaScript的基本概念。小编最近的工作涉及到JavaScript,于是本文就介绍了几个非常重要的JavaScript概念,但绝对不是说JavaScript开发人员只需要知道这些就可以了。01变量赋值(值与引用)Java
Stella981 Stella981
3年前
Javascript 面向对象编程
Javascript面向对象编程(一):封装Javascript是一种基于对象(objectbased)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。那么,如果我们要把"属性
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(