一、js中的数据类型

1、基本类型(值类型):Undefined、Boolean、String、Number、Symbol

2、引用类型:函数、数组、对象、null、new Number(10)都是对象,对象就是引用类型。

  • 值类型的类型判断用typeof,引用类型的类型判断用instanceof

console.log(typeof x); // undefined
console.log(typeof 10); // number
console.log(typeof 'abc'); // string
console.log(typeof true); // boolean

console.log(typeof function () {}); //function

console.log(typeof [1, 'a', true]); //object
console.log(typeof { a: 10, b: 20 }); //object
console.log(typeof null); //object
console.log(typeof new Number(10)); //object

   var fn = function () { };
console.log(fn instanceof Object); // true
  • 特别说明:

   ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值,通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保          证不会与其他属性名产生冲突。

let s=Symbol()

typeof s   //"symbol"

Symbol函数中还可以接受一个字符串参数, 主要是对Symbol实列的描述,主要是为了利于区分;

    let s1=Symbol("foo");

let s2=Symbol("bar");

s1  //Symbol("foo")

s2  //Symbol("bar")

s1.toString()  //"Symbol("foo")"

   s2.toString()  //"Symbol("bar")"

二、js中深拷贝和浅拷贝

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。

先理解主要知识点:栈堆、基本数据类型和引用数据类型

先举一个浅拷贝的例子:let a=[0,1,2,3,4],b=a;

       a[0]=1;

这两种数据类型的存储方式:打印出来后,发现b复制a后,改变b,a也跟着变了,所以接下来了解基本数据类型和引用数据类型;

a:基本数据类型:名和值存储在栈内存中,如 let a=1;

栈内存
name value
a 1

  

当b=a复制时,栈内存会开辟一个新内存,如下图:

栈内存
name value
a 1
b 1
 

所以此时修改a的值时,对b的值不会有影响,因为b的值已经放在了自己的栈内存中,但是一般我们所要讲到的深拷贝主要是针对Object类型数据

b.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值

我们设置 let a=[0,1,2,3,4],b=a;b[0]=1;

最后我们来讲解一下实现深拷贝的方法:

1、可以递归去复制所有层级属性,代码如下:

  function deepClone(obj) {
    if (obj && typeof obj === "object") {
      let objClone = Array.isArray(obj) ? [] : {}
      for (key in obj) {
        if (obj[key] && typeof obj[key] === "object") {
          objClone[key] = deepClone(obj[key])
          } else {
          objClone[key] = obj[key]
        }
       }
    return objClone
    }
  }
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);

 

从上图可以看出,当a改变时,b没有受影响

 2、除了递归,还可以用JSON对象的JSON.parse和JSON.stringify

function deepClone(obj)

{

  let _obj=JSON.stringify(obj),

objClone=JSON.parse(_obj);

  return  objClone

}

let a7=[0,1,[2,3],4],
b7=deepClone(a7);
a7[0]=1;
a7[2][0]=1
console.log(a7,b7)

通过这种方式也能实现深拷贝,此时b不再受a的影响

3、JQ的$.extend

$.extend([deep],target,object1[,objectN])

deep表示为是否为深拷贝,为true为深拷贝,为false为浅拷贝

target目标对象,其他对象的成员属性将会附加在该对象上

object1 objectN,可选,object类型,第一个到第N个被合并的对象

let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);


  

  

  

 

js中的数据类型、以及浅拷贝和深拷贝的更多相关文章

  1. JS中的引用、浅拷贝和深拷贝

    js的深拷贝浅拷贝是很常遇到的问题,一直模模糊糊有点说不过去,所以这次好好总结一下. 1.js的引用 JS分为基础类型和引用类型两种数据类型: 基础类型:number.string.boolean.n ...

  2. 面试题常考&必考之--js中的对象的浅拷贝和深拷贝(克隆,复制)(下)

    这里主要是讲深拷贝: 深拷贝:个人理解就是拷贝所有的层级 1.像对象里再放数组和对象这些叫引用值.开始我们先判断大对象中是否有引用值(数组和小对象), 然后在判断引用值是数组还是对象 2.开始啦: 1 ...

  3. js中的数据类型

    JS中的数据类型: ——数字  (number)NaN ——字符串(string) ——布尔  (boolean)——函数  (function)     也是对象的一种 ——对象  (object) ...

  4. 如何判断js中的数据类型?

    js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...

  5. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  6. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  7. [转]如何判断js中的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...

  8. 浅谈js中的数据类型,使用typeof获取js数据类型

    JS中的数据类型 1):Undefined——值未定义 注:Undefined类型只有一个值,即特色的undefined.在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined ...

  9. 如何判断js中的数据类型(转)

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

随机推荐

  1. 【转载】 “强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识

    原文地址: https://yq.aliyun.com/articles/400366 本文来自AI新媒体量子位(QbitAI)     ------------------------------- ...

  2. Netty 服务端:新连接接入

    本文主要分析服务端新连接的接入过程,主要分为以下 3 各步骤: select 操作: processSelectedKeys 操作. 1. select 操作 在分析 select 操作前,先要回顾一 ...

  3. java 删除多层文件夹

    /** * 因为不小心,写了一个死循环,在电脑里创建的了n多层空文件夹 * 并且手动最外层删除不掉. * 所以用写了本代码,从里向外的进行删除操作. * @author Singularity * @ ...

  4. vue 图片加载失败调用

    <img :src="bak" @error="imgLoadError()" alt="bak"> data(){ retur ...

  5. vue day5 分页控件 更新 PagedList.mvc 仿

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. LeetCode - Implement Magic Dictionary

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  7. LeetCode - Robot Room Cleaner

    Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...

  8. edgedb 内部pg 数据存储的探索 (一)基本环境搭建

    edgedb 是基于pg 上的对象关系数据库,已经写过使用docker 运行的demo,为了探索内部的原理,做了一下尝试,开启pg 访问 后边会进一步的学习 环境准备 为了测试,使用yum 安装 安装 ...

  9. linux 服务器命令

    sudo apt-get update sudo apt-get install sudo passwd 123456 设置root密码 su root 切换root用户 netstat -anlp ...

  10. 深入理解CSS系列(二):为什么height:100%不生效?

    对于height属性,如果父元素height为auto,只要子元素在文档流中(即position不等于fixed或者absolute),其百分比值完全就被忽略了.这是什么意思呢?首先来看个例子,比如, ...