一道面试题 包含了new的细节 和运算符的优先级 还有属性访问机制
function Foo() {
getName = function () { alert(1); }
return this;
}
Foo.getName = function () { alert(2); }
Foo.prototype.getName = function () { alert(3); }
var getName = function () { alert(4); }
function getName () { alert(5); }
这是在网上看到的一道面试题 嗯 考察的知识点挺多 其他的就不多说了
我用我的理解与解题方式来解答这道题
1.首先是变量提升
变量提升包括var 声明的变量和fucntion 声明
举个例子
1.var a=4;
2.function test(){
console.log(456);
};
函数变量声明会先于普通变量之前,并且不会被后面的同名覆盖
但是会被后面的同名赋值覆盖!
就是 function a(){};
var a;
这样不会覆盖函数a
但是如果 var a=4;
函数a就会被覆盖
接下来从第一个开始分析
Foo.getName();
首先变量提升之后是这个样子滴
//变量提升
第一题function Foo(){
getName = function () { alert(1); }//foo函数执行的时候 会覆盖全局中的getName
return this;
/*
new 运算符的时候会执行以下
var obj={};//创建一个空对象
将构造函数的作用域赋给新对象
这个新对象的内置原形指向构造函数的原形对象
obj.__proto__=Foo.prototype;
执行构造函数中的代码
返回这个对象(如果显示返回基本数据类型 无效 还是会返回这个对象
如果返回的是引用类型 那么这个对象将没用了)
*/
}
//变量提升
//2.function getName () { alert(5); }
//变量提升
3.var getName;
4.Foo.getName = function () { alert(2); }
5.Foo.prototype.getName = function () { alert(3); }
6.getName = function () { alert(4); }
之前的2 会被6覆盖 所以2就可以注释掉了
第二题 Foo.getName(); //弹出窗口值为2 不用解释了吧
第三题 getName();//弹出窗口值为4
第四题 Foo().getName(); 先执行Foo();
里面的getName=function(){alert(1);} 会覆盖全局作用域中的6
因为是在全局作用域下调用Foo函数 所以this就是window
window.getName(); //弹出窗口值为6 第五题 new Foo.getName(); new (Foo.getName)(); //弹出窗口值为2
笨想:肯定不会是执行Foo.getName 之后才new 会报错
优先级问题 .(成员访问的优先级高于new 并且从左到右
于是就把Foo.getName这个函数当做构造函数执行
第六题
new Foo().getName();
.运算符从左到右
new Foo(); 返回一个Foo类型的对象 {}
{}.getName();
找不到 然后去构造它的函数Foo的prototype上找
Foo.prototype.getName = function () { alert(3); }
所以结果 3 第七题
也是运算符优先级的问 new new Foo().getName(); 在这里面.的优先级最高
new ((new Foo()).getName)();
先执行.左 然后.右
先执行Foo(); 然后new 返回一个Foo类型的对象
然后得到getName的函数体
然后当做构造函数执行 alert(3) 然后返回一个Foo.getName类型的对象 可能有些地方不是让所有人懂
毕竟我也是一直菜鸟
// Foo.getName(); //2
// getName(); //4
// Foo().getName(); //1
// getName(); //1
// new Foo.getName();//2
// new Foo().getName();//3
// new (new Foo().getName)()//3;
|
优先级 |
运算类型 |
关联性 |
运算符 |
|
20 |
n/a |
( … ) |
|
|
19 |
从左到右 |
… . … |
|
|
从左到右 |
… [ … ] |
||
|
new (带参数列表) |
n/a |
new … ( … ) |
|
|
从左到右 |
… ( … ) |
||
|
18 |
new (无参数列表) |
从右到左 |
new … |
|
17 |
后置递增(运算符在后) |
n/a |
… ++ |
|
后置递减(运算符在后) |
n/a |
… -- |
|
|
16 |
从右到左 |
! … |
|
|
从右到左 |
~ … |
||
|
从右到左 |
+ … |
||
|
从右到左 |
- … |
||
|
从右到左 |
++ … |
||
|
从右到左 |
-- … |
||
|
从右到左 |
typeof … |
||
|
从右到左 |
void … |
||
|
从右到左 |
delete … |
||
|
15 |
从右到左 |
… ** … |
|
|
14 |
从左到右 |
… * … |
|
|
从左到右 |
… / … |
||
|
从左到右 |
… % … |
||
|
13 |
从左到右 |
… + … |
|
|
从左到右 |
… - … |
||
|
12 |
从左到右 |
… << … |
|
|
从左到右 |
… >> … |
||
|
从左到右 |
… >>> … |
||
|
11 |
从左到右 |
… < … |
|
|
从左到右 |
… <= … |
||
|
从左到右 |
… > … |
||
|
从左到右 |
… >= … |
||
|
从左到右 |
… in … |
||
|
从左到右 |
… instanceof … |
||
|
10 |
从左到右 |
… == … |
|
|
从左到右 |
… != … |
||
|
从左到右 |
… === … |
||
|
从左到右 |
… !== … |
||
|
9 |
从左到右 |
… & … |
|
|
8 |
从左到右 |
… ^ … |
|
|
7 |
从左到右 |
… | … |
|
|
6 |
从左到右 |
… && … |
|
|
5 |
从左到右 |
… || … |
|
|
4 |
从右到左 |
… ? … : … |
|
|
3 |
从右到左 |
… = … |
|
|
… += … |
|||
|
… -= … |
|||
|
… *= … |
|||
|
… /= … |
|||
|
… %= … |
|||
|
… <<= … |
|||
|
… >>= … |
|||
|
… >>>= … |
|||
|
… &= … |
|||
|
… ^= … |
|||
|
… |= … |
|||
|
2 |
从右到左 |
yield … |
|
|
从右到左 |
yield* … |
||
|
1 |
n/a |
... … |
|
|
0 |
从左到右 |
… , … |
一道面试题 包含了new的细节 和运算符的优先级 还有属性访问机制的更多相关文章
- (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节
背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...
- PHP递归创建多级目录(一道面试题的解题过程)
今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @mkd ...
- 关于Java类加载双亲委派机制的思考(附一道面试题)
预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...
- 一道面试题比较synchronized和读写锁
一.科普定义 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步关键字相信大家都用得比较多,在上一篇“多个线程之间共享数据的方式”中也详细列举他的应用, ...
- <转>一道面试题比较synchronized和读写锁
一.科普定义(原文:http://903497571.iteye.com/blog/1874752) 这篇博文的两个主角“synchronized”和“读写锁” 1)synchronized 这个同步 ...
- 一道面试题与Java位操作 和 BitSet 库的使用
前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...
- 【C#基础知识】静态构造函数,来源于一道面试题的理解
看到园友的一道面试题,很好奇,测试了一下结果. public class A { public static int X=B.Y ; public A() { ++X; } } public clas ...
- 关于一道面试题,使用C#实现字符串反转算法
关于一道面试题,使用C#实现字符串反转算法. 题目见http://student.csdn.net/space.php?do=question&ac=detail&qid=490 详细 ...
- 一道笔试题和UML思想 ~
一句软件工程界的名言,让我想起了一个和一道笔试题有关的故事.希望更多的人了解 UML 背后的思想比他的语法更重要,是笔者写作本文的一点小愿望. 一.从一句软件工程名言说起 对很多事情的处理上,东西方都 ...
随机推荐
- android手机访问app网页报错:net::ERR_PROXY_CONNECTION_FAILED
手机访问网页报错:net::ERR_PROXY_CONNECTION_FAILED 手机访问app中嵌入的html网页报错: net::ERR_PROXY_CONNECTION_FAILED 原来是手 ...
- zabbix系列(五)zabbix3.0.4 探索主机Discovery自动发现主机详细图文教程
Zabbix 自动发现(Discovery)功能使用 随着监控主机不断增多,有的时候需要添加一批机器,特别是刚用zabbix的运维人员需要将公司的所有服务器添加到zabbix,如果使用传统办法去单个添 ...
- Linux(CentOS7)安装zip、unzip命令
安装命令: yum install -y unzip zip
- Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库
一:章节前言 本章着眼于影响表中数据存储性能的数据库特性. 表的性能部分取决于在创建之前所应用的数据库特性.例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能.类似地,表 ...
- vue-cli 搭建的项目处理不同环境下请求不同域名的问题
使用 vue-cli 开发项目过程中, 根据开发环境和正式环境不同, 我们往往需要请求不同域名下的后台接口, 这时候, 该怎么去设置, 达到同一种写法可以根据环境不同而自动切换请求域名呢? 本文将会介 ...
- php和NodeJs共存的开发环境
1 折腾 php nodejs 到一起 nodejs当然很火,就像着火了一样,但是必须承认要搭建一个前端的demo开发环境还是PHP靠谱, windows下可以非常的集成套件,比如http://www ...
- 移位操作符 << >> >>>
按位操作符只可用于int类型,其它类型都会转化位int类型在操作,并且只有数值右端的低5位才右用(因为2^5=32) << 左移位操作符,低位补零 >> 右移位操作符,有符 ...
- python接口自动化测试十八:使用bs4框架爬取图片
# 爬图片# 目标网站:http://699pic.com/sousuo-218808-13-1.htmlimport requestsfrom bs4 import BeautifulSoupimp ...
- js在字符串中提取数字
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
官网网址:https://www.hcharts.cn/ 中文版的(参考起来方便,你懂的.):http://www.mamicode.com/info-detail-446038.html 网上已经有 ...