这个问题是我逛直播时看到一位大佬,在讲解前端开发JavaScript代码编写说道:“在大厂里var变量是不能直接赋值undefined的,而是要有void来赋值”。

???

我当时就纳闷了。这两种赋值效果不是一样的嘛?

var a = undefined;
var a = void 0;

a都是undefined。没区别呀!

当时大佬没有停下来细说,继续传授知识干货。但我可听不进了,一直的纠结这个问题,然后去各大网站寻找结果。最终皇天不负有心人,让我终于知道为什么了。

接下来我分享给大家:

首先让大家了解一下这个void是什么?

学习过C语言的同志们应该有一定的了解,在JavaScript中void是关键字,void后面跟着的是一个表达式,表达式可以随便是什么值。

void 0
void 1
void 'abc'

最终void都会返回一个undefined,void就是来制造一个undefined的,我们一般习惯上会把表达式写成0,但是大部分人不会这样写来赋值undefined。可是大厂就是要有这种方式来赋值。

来来来,重点来了!!!

仔细思考思考,研究研究,你就会发现大厂为什么是大厂了。

因为在JavaScript里面undefined不是关键字。

undefined是window的一个属性

window.undefined

我第一次看到并且知道以后整个人都傻了,突然感觉学的还不够“毒打”挨少了。我以为undefined是关键字,可undefined不是,但undefined应该要是的呀。为什么会不是呢?可能是JavaScript的作者Brendan Eich当年被资本压榨的太严重了吧,这一块设计的有缺陷。我还特意找了的这个还真是一个bug。undefined由于是window的一个属性,所以能干嘛呢?它是可以赋值的。

window.undefined = 1

有这样想法的同志们非常不错,但是这个属性是一个只读属性。因此,你对它赋值是没有意义的,得到的还是undefined。这样看来它是没有隐患的呀。哎,这样想的同志们就错了。它还真的有隐患,比方说我们写一个函数就要出问题了。

function a(){
var undefined = 1;
}

我们在函数里定义变量为undefined(因为undefined不是关键字是可以定义为变量名),而在函数里面定义了unfettered这个变量之后,我们在接下来的编写中再使用这个unfettered的时候,它用的就不是全局对象里面的那个undefined,用的就是这个变量undefined了,所以是这样子后边一赋值为undefined就要出问题了。

function a(){
var undefined = 1;
var a = undefined;
console.log(a);
}

现在我们再输出一下这个a,大家运行以后就会发现会输出一个结果1,会出现这样一个问题。

可能大家觉得没有人会这样写代码呀,因为要出问题的前提条件,要定义一个变量名为undefined没有人会这样写的。只要正常人都不会这样去做,所以说很多公司,就无所谓,甚至不会注意这个问题。但是大厂不一样,大厂不会这么看,因为大厂面向的是上忆的用户,大厂站着高位置越高大厂的影响就会越大自然责任就会越大。所以有的事是非常非常小概率,但是造成的影响结果是不能接受的。所以在大厂里面他们会尽力的去消除这些隐患。在业务上的事情,定要追求极致的严谨和仔细——这就是大厂。毕竟大厂的每一个代码规定都是前辈们踩过的坑嘛。

好了本次分享就到此为止,感谢同志们的阅读。记得点赞关注收藏,本文如有错误欢迎大家来评论区指出,谢谢!!!

为什么有的大厂,变量不能直接赋值undefined?相关推荐

  1. “睡服”面试官系列第三篇之变量的结构赋值(建议收藏学习)

    目录 变量的解构赋值 1. 数组的解构赋值 2. 对象的解构赋值 3. 字符串的解构赋值 4. 数值和布尔值的解构赋值 5. 函数参数的解构赋值 6. 圆括号问题 7. 用途 变量的解构赋值 1. 数 ...

  2. 使用var声明的变量 和 直接赋值并未声明的变量的区别

    在看JS高级程序设计时忽然想到这个问题,众所周知,直接赋值一个变量而为声明,会产生一个全局变量(或者说是全局对象的属性),但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢,这是我在百 ...

  3. ECMAScript6学习笔记 ——let、const、变量解构赋值

    let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...

  4. Go 学习笔记(26)— Go 习惯用法(多值赋值,短变量声明和赋值,简写模式、多值返回函数、comma,ok 表达式、传值规则)

    1. 多值赋值 可以一次性声明多个变量,并可以在声明时赋值,而且可以省略类型,但必须遵守一定的规则要求. package main import "fmt"func main() ...

  5. 变量 常量 Python变量内存管理 赋值方式 注释

    目录 变量 1.什么是变量 2.为什么有变量? 3.定义变量 4.变量的组成 5.变量名的命名规范 6变量名的两种风格 常量 Python变量内存管理 1.变量存哪儿? 2.Python垃圾回收机制 ...

  6. C/C++中的指针变量可以相互赋值,使得它们指向同一块地址空间

    两个指针变量可以相互赋值吗? int *p, *q; p=q; 这样写是什么意思?是p指向q吗? 答:1.两个指针变量之间可以相互赋值,p和q都是int类型的指针. p=q表示将q所指向的int类型变 ...

  7. java 静态对象赋值_基于Java class对象说明、Java 静态变量声明和赋值说明(详解)...

    先看下JDK中的说明: java.lang.Object java.lang.Class Instances of the class Class represent classes and inte ...

  8. java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  9. 1.2编程基础之变量定义、赋值及转换 10 Hello, World 的大小

    http://noi.openjudge.cn/ch0102/10/ #include <bits/stdc++.h> using namespace std; int main( voi ...

最新文章

  1. C语言面试题-这些简单的你能很快的写出来吗?
  2. yii2 设置的缓存无效,返回false,不存在
  3. 帝国CMS后台前台上传大小和类型限制的解决方法!
  4. python怎么导入大小字母_isort-用于对python导入的库按照字母进行排序的工具
  5. leetcode1299. 将每个元素替换为右侧最大元素
  6. 2台服务器负载均衡后synchronized_一篇有趣的负载均衡算法实现
  7. 响应式网页设计简单入门
  8. 为什么我一再强调说新手创业不适合再开淘宝店?
  9. IntelliJ Idea 常用快捷键 超实用!
  10. oracle tcp 上限,操作系统用户最大进程数限制maxuproc
  11. 微信小程序 宠物论坛1
  12. 计算机网络自学指南,简直太全了!
  13. android logo颜色渐变,华为悄然更新品牌Logo:无渐变色,更加扁平化
  14. Buuctf rar
  15. 常用的JavaScript位操作(Bitwise)
  16. 云安全将来时 | 云安全的发展与未来趋势
  17. Telegraf 简单使用介绍
  18. Bidirectional Machine Reading Comprehension for Aspect Sentiment Triplet Extraction 论文阅读
  19. QML和C++之间的数据类型转换
  20. Chrome的使用技巧

热门文章

  1. Centos7配置网络
  2. ubuntu运行Openvino出现 ModuleNotFoundError: No module named ‘openvino.model_zoo.model_api‘解决
  3. c语言iota怎么用,常量及iota的简单用法
  4. 实时大数据处理real-time big data processing (RTDP)框架:挑战与解决方案
  5. 把梳子卖给和尚的故事
  6. 为什么p元素内不能嵌套Div元素(随笔)
  7. 微型计算机汇编语言与接口技术答案,32位微机原理、汇编语言及接口技术教程课后习题答案.doc...
  8. 2022高级Android笔试总结,记录下我磕磕碰碰的三个月找工作经历
  9. 我去扒了杜蕾斯的微博
  10. MQ消息队列(三)RabbitMQ及Erlang安装过程中常见问题