由 Array.includes 函数引发对引用数据类型的思考
``
数组的includes方法在日常的编程中比较常用到,其作用就是判断某一数据是否在数组中,通常来说,数组中的数据如果是数字,布尔值,或者字符串的话,都是能够进行判断的
例如:
[1,2,3,4].includes(3) // true
[1,2,3,4].includes(5) // false
[true, false].includes(false) // true
[false, false].includes(true) // false
['foo', 'bar'].includes('foo') // true
['foo', 'bar'].includes('baz') // false
如果是对象的话,那么会有一个有趣的现象发生
var p1 = { age: 11, name: 'bob'};
var p2 = { age: 13, name: 'kebei'};
var arr = [p1, p2];
arr.includes({ age: 11, name: 'bob'}); // false
arr.includes(p1) // true
var p3 = { age: 11, name: 'bob'};
arr.includes(p3); // false
arr.includes({ age: 11, name: 'bob'}) 这行,includes里面是一个字面量对象, 而arr中存的数据是p1, p2两个数据的引用地址,所以返回值是false;
arr.includes(p1)的话,结合下图来看,等同于[0000, 0010].includes(0000), 所以是true.
再下一行,p3的申明赋值在内存总开辟了一个新的地址,这个地址指向真实数据的地址,所以p3和p1的地址是不一样的, 从下图可以看到, p3对应地址的值虽然和p1的一样,但是,它也并没有指向p1。

当然,如果p3的赋值方式是 p3 = p1 的话,那么 arr.includes(p3)的值就是true了,因为p1的地址赋给了p3, 那么p3指向的就是p1所代表的对象了。
虽然javascript是一门动态语言,但是在一些复杂对象的使用上和C这样的静态语言是很相似的。而javascript较C而言,它本身不需要做取指针操作,当一个变量的值是一个引用对象时,变量等于自动取了指针。所以说,上面例子中 p3 = p1, 就是指针赋值过程。
由 Array.includes 函数引发对引用数据类型的思考的更多相关文章
- ES6,Array.includes()函数的用法
在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...
- ES6之Array.includes()函数
一.定义 includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. 二.语法 arr.includes(searchElement) arr.includ ...
- java的引用数据类型,你知道吗???
有些人很清楚java的八种基本数据类型,但说到java的引用数据类型就不清楚了. Java的数据类型分为两大类,即基本数据类型和引用数据类型,在基本数据类型中有8种 基本数据类型(逻辑型-boolea ...
- java基础-引用数据类型之一维数组(Array)
java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- java 方法修改主函数里基本数据类型和引用数据类型的区别
public class Dog { public void Age(int age) {//副本新建的age age++;//对副本修改 System.out.println(age); } pub ...
- ES6学习笔记(二):引用数据类型
Array 新增方法 1.Array.from() 将类数组(dom对象 或 arguments)或set\map对象转换为数组 2.Array.of() 将一组值转换为数组,例如Array.of(3 ...
- JavaScript中基本数据类型和引用数据类型的区别
1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...
- js数组和对象相等判断、拷贝详解(结合几个现象讲解引用数据类型的趣事)
序言 最近遇到几个js引用数据类型造成的bug,今天结合bug详细分析一下,避免以后再犯,也希望能帮大家提个醒,强化js基本功. 目录 1.浅拷贝.深拷贝,解决变量赋值相互影响问题 2.判断2个数组. ...
- javascript数据基本类型和引用数据类型区别
基本类型和引用数据类型区别 1.基本数据类型和引用数据类型 javascript中有两种数据类型,分别是基本数据类型和引用数据类型: 基本数据(原始数据)类型指的是简单的数据段,而引用数据类型则指的是 ...
随机推荐
- 纯离线部署本地知识库LLM大模型
纯离线部署本地知识库LLM大模型 一.下载离线大模型 下载的网址:https://hf-mirror.com/ deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下 ...
- LaTeX使用记录
安装与使用 曾在Windows10下装过MikTeX,并配合vscode插件LaTeX Workshop使用过一段时间:这次转到wsl2中,并使用texlive,所以插件的配置json需要小修改 参考 ...
- k8s:The connection to the server localhost:8080 was refused - did you specify the right host or port?
前言 k8s 集群 node节点报错:The connection to the server localhost:8080 was refused - did you specify the rig ...
- websocket 后台新订单通知 —— Laravel 5.8 Laravel-echo-server教程
websocket 后台新订单通知 -- Laravel 5.8 workman PHPSocket.IO教程 环境要求: Laravel 框架 (5.8 版本) Redis 服务 1.安装 lara ...
- JdbcTemplate 自定义返回的结果集字段和实体类映射
废话不多:抄袭代码 package com.webank.wedatasphere.qualitis.handler; import com.webank.wedatasphere.qualitis. ...
- 查看docker服务状态
root用户使用 #查看docker服务状态: systemctl status docker 非root用户使用 #查看docker服务: sudo systemctl status docker
- 【python-数据分析】pandas数据提取
import pandas as pd 1. 直接索引 df = pd.DataFrame({'AdmissionDate': ['2021-01-25','2021-01-22','2021-01- ...
- 浅聊java运行机制
Java程序运行机制 首先要清楚运行机制一般有两种 解释型 编译型 解释型: 顾名思义,就像有个人在旁边给你解释东西一样.比如看一本英文书,英语老师在旁边一句一句给你翻译解释.在写源代码时,每写一个 ...
- study Rust-4【所有权】这个太重要了!
由于Rust内存垃圾自动回收,那就得搞清楚这个所有权玩意.这个太重要了.因为关系到贯穿于你以后的程序编写. 几个概念: 一.移动 1.咱们一般语言,自己申请内存,自己管理和释放.就是new和free. ...
- MySQL获取周、月、天日期,生成排序号
常用MySQL生成时间序列 --生成最近七天的日期,不包括当天 SELECT @cdate := date_add(@cdate, interval - 1 day) as date FROM(SEL ...