js的基本数据类型与引用数据类型
基本数据类型与引用数据类型
基本数据类型有五种
/*
基本数据类型有:
- String
- Number
- Boolean
- Null ** typeof null === 'object' 这只是js的遗留问题,null仍归属于普通数据类型
- Undefined
*/
var string = 'good'
var number = 123
var boolean = true
var nu11 = null
var undef1ned = undefined
引用数据类型有一种
/* 数组与对象都属于Object数据类型 */
var obj = {}
var arr = []
值传递在两种数据类型下的不同表现
var num = 123
var obj = {
numInObj: 456
}
/* 普通数据类型的值传递 */
var num2 = num
console.log(num) // 123
console.log(num2) // 123
num++
console.log(num) // 124
console.log(num2) // 123
num2++
console.log(num) // 124
console.log(num2) //124
/*
通过以上简单的尝试可以看到:
普通数据类型的值传递,就像克隆了一份原数据,新旧数据之间完全独立
它们的改变都不会影响到对方,这其实就是深拷贝
*/
/* 引用数据类型的值传递 */
var obj2 = obj
console.log(obj2.numInObj) // 456
obj.numInObj = 666
console.log(obj.numInObj) // 666
console.log(obj2.numInObj) // 666
obj.numInObj = 888
console.log(obj.numInObj) // 888
console.log(obj2.numInObj) // 888
/*
可以看到,引用数据类型的值传递,与普通类型的值传递大不同
引用数据类型的值传递的情况: 旧数据像是被人施加巫毒娃娃的效果
对巫毒娃娃的操作(新数据)也会作用到实体身上(旧数据),当然对旧数据
操作也会影响新数据
*/
由值传递结果的不同引发对两种数据类型的思考
通过以上的实验,两种数据类型的值传递情况是不一样的,那么导致这种结果的原因是啥呢?这里直接引出概念堆内存
与栈内存
。
我们在js中声明的所有变量,及变量所携带的数据都是存在内存中的,内存在内部分为堆内存
与栈内存
,而不同数据类型是存储在不同内存中的
基本数据类型的属性与属性值都是直接保存在栈内存中的
var num = 123
普通数据类型的值传递,就像克隆了一份原数据,新旧数据之间完全独立,它们的改变都不会影响到对方
var num = 123
var num2 = num
num = 666
console.log(num2) //123
num2 = 999
console.log(num) //666
引用数据类型,当然指的就是对象、数组这些。它们的储存就不是说单纯的储存在堆内存或者是栈内存中了,而是其属性名
保存在栈内存
中,属性值
保存在堆内存
中。此时有人就会想那怎么能够保持使得属性名对应正确的属性值呢?,答案就是,当我们申明一个对象时,会在堆内存
中开辟一个区域,区域有标识属于它的、唯一的内存地址值
。往后对象的所有数据都会储存在将这块区域中,而在栈内存
中的属性名
通过保存这个内存地址值
,就能正确找到对象和其中的数据了。
// 对象的字面量
var obj = {
name: 'Fitz',
age: 21
}
引用数据类型的值传递的情况: 旧数据像是被人施加巫毒娃娃的效果对巫毒娃娃的操作(新数据)也会作用到实体身上(旧数据),当然对旧数据操作也会影响新数据,最主要的原因就是,它们都指向同一块内存
// 对象的字面量
var obj = {
name: 'Fitz',
age: 21
}
var obj2 = obj
obj.name = 'lx'
console.log(obj.name) // lx
console.log(obj2.name) // lx
js的基本数据类型与引用数据类型的更多相关文章
- js原始数据类型和引用数据类型=>callback数据传输原理
摘要:js的数据类型有种划分方式为 原始数据类型和 引用数据类型. 原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.栈区包括了 变量的标识符和变量的值. ...
- JS基本数据类型和引用数据类型的区别及深浅拷贝
前言 首先我们先来了解一下什么叫栈堆,基本数据类型与引用数据类型 1.栈(stack)和堆(heap)stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动 ...
- JS基本数据类型和引用数据类型区别
1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.数据类型 JS分两种数据类型: 基本数据类型:Numb ...
- js 原始数据类型、引用数据类型
js的数据类型划分方式为 原始数据类型和 引用数据类型 栈: 原始数据类型(Undefined,Null,Boolean,Number.String) 堆: 引用数据类型(对象.数组.函数) 两种类型 ...
- js中基本数据类型和引用数据类型的区别
1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...
- javascript 基本数据类型、引用数据类型
阅读目录 数据类型 两种访问方式 两种类型复制 函数参数的传递 两种变量类型检测 回到目录 数据类型 1. ECMAScript变量包含两种不同类型的值:基本类型值.引用类型值: 2. 基 ...
- Object 对象(对象的分类、属性(属性名和属性值)、基本数据类型与引用数据类型区别)
Object——引用数据类型 基本数据类型的不足之处:基本数据类型是单一的值,不能表现出值与值之间的所属关系 object分为内建对象.宿主对象和自定义对象 a 内建对象:ES标准中定义的对象,在任何 ...
- JavaScript中基本数据类型和引用数据类型的区别(栈——堆)
JavaScript中基本数据类型和引用数据类型的区别 1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据 ...
- JAVA-基本数据类型与引用数据类型区别
package com.liu.u6.copy1; /* * 基本数据类型与引用数据类型有什么区别 */ public class Sjlx { public int age; } package c ...
随机推荐
- PTA 乙 1001
1001 害死人不偿命的(3n+1)猜想 题目描述 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍下 ...
- Educational Codeforces Round 67 E.Tree Painting (树形dp)
题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...
- P1091 合唱队形(LIS)
题目描述 NNN位同学站成一排,音乐老师要请其中的(N−KN-KN−K)位同学出列,使得剩下的KKK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,-,K1,2, ...
- hdu2818 Building Block
Problem Description John are playing with blocks. There are N blocks (1 <= N <= 30000) numbere ...
- hdu4533 威威猫系列故事——晒被子
Problem Description 因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了. 生活还要继续,太阳也照常升起,今天,威威猫在第一象限 ...
- Power Strings POJ - 2406 后缀数组
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- JavaScript——匿名函数和闭包
匿名函数就是没有名字的函数 闭包就是一个函数中的另一个函数 函数可以不加分号,但是语句要加!! 可以把匿名函数的返回值赋值给变量!! box()时返回里面的函数,再加一个()就会返回里面那函数的值(浅 ...
- Keywords Search HDU - 2222 AC自动机板子题
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...
- Leetcode(1)-两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- URLSearchParams & shape URL params
URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams var paramsString = ...