JavaScript运算符优先级的详细分析(附示例)

本篇文章给大家带来的内容是关于JavaScript运算符优先级的详细分析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

写了两年的JavaScript的我,原以为是不会在语法上阴沟里翻船的,可是事实上被打脸,最近在产品开发中组里的一个帅小伙找我讨论一个问题,为了方便大家阅读,我将这个问题的模型抽象出来:

var provider = {    test: {        $get: function(){            return function anonymous(config){            };        }    }};var type = "test";var config = {};new provider[type].$get()(config);

登录后复制

上面的语句运行时候为什么函数anonymous中的this指向的是window而不是new创建的新对象。我当时听到这个问题的第一时刻想的是: 纳尼 !怎么可能new操作符对应的构造函数中的this指向的不是新创建的对象实例呢?当时由于并没有仔细地将问题从业务中抽象出来,其实我也有点迷糊,但仔细一想,这个语句到底要表达什么呢?

思考

立即学习“Java免费学习笔记(深入)”;

在说这个表达式所要表达的含义之前,先说一个关于new操作符的几个小知识:

构造函数的返回

JavaScript构造函数中可以返回值,也可以不返回值,比如:

function Person(){}var person = new Person()

登录后复制

我们知道这个时候构造函数返回的是创建的实例对象,也就是构造函数中this所指向的对象。但是当你构造函数有返回值时,就要分情况区分。如果返回的是一个非引用类型的值时,实际上返回的是仍然是新创建的实例对象。但是当返回的是一个引用类型的值时,返回的是引用对象本身。比如:

function Person(){    return function(){}}var person = new Person()typeof person // "function"

登录后复制

在JavaScript中函数作为一等公民,实质上就是引用类型,因此person就是返回的匿名函数。

new操作符的两种形态

其实在MDN的new操作符描述中,语法是

new constructor[([arguments])]

登录后复制

你会发现([arguments])被中括号所包围也就意味着可缺省,因此,如果对于不含参数的构造函数而言:new Person()与new Person二者并无区别,那我们接着思考一个问题,对于前面返回函数的Person而言,当new Person()的时候为什么执行的是new Person()而不是(new Person)()呢。之前如果阅读过我之前的一篇文章的同学知道,带有参数的new操作符的优先级大于无参数列表的new操作符。因此总是会执行第一种而不是第二种。

1862029288-586fbdb722b3c_articlex.png

了解上面的步骤之后,我们已经接近了问题的本质,对于表达式

new provider[type].$get()(config);

登录后复制

JavaScript引擎到底是解析成:

(new provider[type].$get())(config);

登录后复制

还是

new (provider[type].$get())(config);

登录后复制

对于第一种形式而言,(new provider[type].$get())返回的是anonymous函数,因此在anonymous(config)中内部this指向是window。而第二种模式中provider[type].$get()返回的是anonymous函数,因此运行new anonymous(config)时内部的this指针指向的是新创建的实例this。

当然我们从问题: this为什么指向的是window而不是new创建的新对象中可以看出来,其实作者当时想要表达的是第二种含义,但实际上却以第一种方式在运行。为什么?原因非常简单,第一种执行方式JavaScript引擎首先解析的是带参数列表的的new操作符,而第二种方式则是先执行了函数调用,再执行的是new操作符,我们对照上面的优先级图可以看到,带参数列表的new优先级高于函数调用,因此肯定是以第一种方式去运行。

其实这篇文章并没有多少干货,但是从中还是有两点感悟吧,第一,从上一篇同类文章中我就强调避免使用这种模糊不清的表达式,多用几个括号一切问题都迎刃而解,比如有的同学会写出类似于:

var str = "Hello" + true ? "World" : "JavaScript";

登录后复制

那请问str内容是什么呢,有的人可能认为是Hello World,有的人会认为是World,实质上运算的结果是World,
因为+运算符优先级是高于条件运算符的,这时候添加括号会让你的代码变得更加易于阅读。第二,保持对技术的敬畏吧,最怕的就是你觉得你都会了,其实你一无所知。

以上就是JavaScript运算符优先级的详细分析(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2736211.html

(0)
上一篇 2025年3月8日 01:22:03
下一篇 2025年3月3日 16:18:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • es6中babel的用法介绍(代码示例)

    本篇文章给大家带来的内容是关于es6中babel的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 polyfill 我们都知道,js总是一直存在着兼容性问题,虽然其他语言也存在着兼容性问题,比如c++、…

    2025年3月8日 编程技术
    200
  • ES6中Symbol相关知识的介绍(代码示例)

    本篇文章给大家带来的内容是关于es6中symbol相关知识的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 symbol是es6出的一种类型,他也是属于原始类型的范畴(string, number, boo…

    编程技术 2025年3月8日
    200
  • ES6中核心特性的用法介绍(附示例)

    本篇文章给大家带来的内容是关于es6中核心特性的用法介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时…

    2025年3月8日 编程技术
    200
  • jsp和javascript的区别是什么

    jsp和javascript的区别:1、javascript一般在前台运行,要求浏览器要支持js,而JSP是在后台服务器上的,主要用于控制html;2、jsp和javascript的的表现形式不同。 本文操作环境:Windows7系统、De…

    2025年3月8日
    200
  • Vue中用props给data赋初始值时遇到的问题及解决方法

    本篇文章给大家带来的内容是关于vue中用props给data赋初始值时遇到的问题及解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前段时间做一个运营活动的项目,上线后产品反馈页面埋点不对,在排查过程中发现,问题竟然…

    2025年3月8日 编程技术
    200
  • CORS跨域的深入理解(代码示例)

    本篇文章给大家带来的内容是关于cors跨域的深入理解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 面试问到数据交互的时候,经常会问跨域如何处理。大部分人都会回答JSONP,然后面试官紧接着就会问:“JSONP…

    2025年3月8日
    200
  • Vue自定义指令的学习理解(代码示例)

    本篇文章给大家带来的内容是关于vue自定义指令的学习理解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近搞了毕设,需要实现一个场景,点击一块区域,弹出一个编辑区域,点击页面的其他地方的时候,这个编辑区域就隐…

    编程技术 2025年3月8日
    200
  • 使用electron实现满屏爱心的效果(代码示例)

    本篇文章给大家带来的内容是关于使用electron实现满屏爱心的效果(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 图片被压缩了 看起来有点难看 主进程代码 import {BrowserWindow, app…

    2025年3月8日
    200
  • react中key的具体使用方法介绍(代码示例)

    本篇文章给大家带来的内容是关于react中key的具体使用方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在开发react程序时我们经常会遇到这样的警告,然后就会想到:哦!循环子组件忘记加key了~ 出…

    2025年3月8日 编程技术
    200
  • 如何在 JavaScript 中获取 CSS 值?有什么方法

    本篇文章给大家带来的内容是关于如何在 javascript 中获取 css 值?有什么方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 有时候单独的使用CSS是不够的。您可能需要使用JavaScript控制CSS值。但是…

    2025年3月8日
    200

发表回复

登录后才能评论