为什么[null] === [null]输出为false❓

简介: 有人问,为什么null === null 输出值true,但是[ null ] === [ null ]输出值却是false?

现象

有人问,为什么null === null 输出值true,但是[ null ] === [ null ]输出值却是false?

那么,
先来展示几个代码,看看你认为的输出值,是不是正确的

console.log('null log:',null == null); // true

console.log('null array log:',[] === []);    // false
console.log('null object log:',{
   } === {
   });    // false
console.log('array log:', ['1']=== ['1']);    // false
console.log('object log:',{
   name: 'look'} === {
   name: 'look'});    // false

const array1 = ['item'];
const array2 = ['item1', 'item'];
console.log('array item log:', array1[0]=== array2[1]);    // true

const object1 = {
   name: 'look'};
const object2 = {
   name: 'look'};
console.log('object key log:', object1.name === object2.name);    // true

原因

如上可知,如论是空的数组还是空的对象,或者有值的数组或对象,使用 === 的时候,都是输出的false。
发挥一下思维,数组和对象在javaScript中,广义的都被称为object,想不明白的话,输出一下

console.log(typeof({
   }))
console.log(typeof({
   }))

还不明白吗?

那么,再来理解两个概念吧!

栈 stack 和 堆 heap

栈(stack):

  • 先进后出;
  • 自动分配内存空间;
  • 由系统自动释放;
  • 使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完立即释放。

堆(heap):队列优先

  • 先进先出;
  • 动态分配内存,大小不定也不会自动释放;
  • 存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定;一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。

数据类型:(7种)

存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
Undefined / Null / Boolean / Number / String,它们是直接按值存放的,可以直接访问。

Object/Symbol,当我们需要访问引用数据类型 (对象 / 数组 / 函数) 的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

  • 对象(Object):表示复杂的数据结构,可以包含其他数据类型和对象,例如数组、函数、日期等
  • Symbol:ES6 新增的一种数据类型,表示独一无二的值,通常用于对象的属性名。

变量a实际保存的是指向堆内存中对象的一个指针,而b保存的是指向堆内存中另一个对象的一个指针;虽然这两个对象的值是一样的,但它们是独立的2个对象,占了2份内存空间;所以 ab 为 false。
如果 var a = {}; var b = a; 这时变量b复制了变量a保存的指针,它们都指向堆内存中同一个对象;所以 ab 为 true。
到这里问题已经解决了,但我们需要深入学习一下;

传值与传址?

基本类型与引用类型最大的区别实际就是 传值与传址的区别。

var a = [1,2,3,4,5];
var b = a;
var c = a[0];
console.log(b); // [1,2,3,4,5]
console.log(c); // 1
b[4] = 6;
c = 7;
console.log(a[4]); //6
console.log(a[0]); //1


从上面代码可以得知,当改变b中的数据时,a也发生了变化;但是当我们改变c的数值时,a却没有发生改变。
这就是传值与传址的区别。因为a是数组,属于引用类型,所以a给b传的是栈中的地址,而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数值,并保存在栈中。所以b修改的时候,会根据地址回到a堆内存中修改;c则直接在栈中修改,并且不能指向a堆内存中。

const one = 1;
const two;
if ( one ) {
   
  two = one;
} else {
   
  two = "222";
}
return two;

寄语

知其然,知其所以然

目录
相关文章
|
SQL Oracle 关系型数据库
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
【问题处理】—— SQL里进行 null值 的判断永远返回 false?
92 0
|
6月前
|
JSON PHP 数据格式
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
php 删掉空的数组 json数据. 空数据(false 0 ““ null)
|
6月前
|
JavaScript 前端开发
JavaScript快速删除对象数组中某一个指定元素。注意:是对象数组,如果是数值数组,请慎用!会伤及无辜0、false、英文空格、undefined、null。
JavaScript快速删除对象数组中某一个指定元素。注意:是对象数组,如果是数值数组,请慎用!会伤及无辜0、false、英文空格、undefined、null。
|
PHP
php开发实战分析(3):php中判断变量为空(0、false、null)的方法
php开发实战分析(3):php中判断变量为空(0、false、null)的方法
254 0
|
JavaScript 前端开发 数据库
|
PHP 安全
PHP中空字符串介绍0、null、empty和false之间的关系
PHP中空字符串介绍0、null、empty和false之间的关系 作者: 字体:[增加 减小] 类型:转载 时间:2012-09-25   用PHP开发那么久,PHP中空字符串、0、null、empty和false之间的关系总是有些不确定的东西。
989 0
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
148 2
|
3月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
632 0
在 MySQL 中使用 IS NULL
|
3月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
105 0

热门文章

最新文章