js基础类型和复杂类型
2019-06-21 本文已影响0人
椋椋夜色
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> js基础类型和复杂类型 </title>
JavaScript 数据类型 : https://www.runoob.com/js/js-datatypes.html
</head>
<body>
<p>
JavaScript中的数据类型有两种: <br>
简单数据类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(ES6新增)。<br>
布尔(逻辑)只能有两个值:true 或 false。<br>
Undefined (未定义) 这个值表示变量不含有值。可以通过将变量的值设置为 null 来清空变量。person=null; <br>
Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值<br>
复杂数据类型(引用数据类型):对象(Object)、数组(Array)、函数(Function)。<br>
</p>
<a href="https://www.runoob.com/js/js-datatypes.html">JavaScript 数据类型</a>
<p>
(扩展) <br>
1.在内存中的存储方式 <br>
简单数据类型把数据名和值直接存储在栈当中<br>
复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储属性及值。访问时先从栈获取地址,再到堆中拿出相应的值。<br>
2.不同数据类型作为参数时 函数内部对参数的修改是否改变外部变量的值<br>
(1)简单数据类型作为参数时,函数内部对参数值的修改不会改变外部变量的值<br>
function a(s){//定义以s为参数的函数,返回s的值
s=100;
return s;
}
var y=1;
a(y);//y作为参数调用函数a
console.log(y);//y还是为1 <br>
结果还是1因为把y的值给s时是简单的复制了一份,y和s可以单独操作不相互影响 <br>
(2)复杂数据类型作为参数时,函数内部对参数值的修改会改变外部变量的值 <br>
因为复杂数据类型赋值是把栈中对象的地址赋给变量,函数内外两个变量指向同一个对象,所以只要对象的属性值改变,两个变量值都会改变<br>
function student(age,name,agrde){
this.age=age;
this.name=name;
this.score=agrde;
} <br>
var s1=new student(18,"liang",2);//创建一个student对象<br>
console.log(s1); // student {age: 18, name: "liang", score: 2} <br>
function a(s){
s.name="xxx";
}
a(s1)//把s1赋给s
console.log(s1.name);//输出xxx <br>
所以要弄懂js中简单数据类型和复杂数据类型的区别,关键还要搞懂两个在内存中的存储过程。<br>
基本类型存储的是值,复杂类型存储的是地址(指针)。<br>
当你创建了一个复杂类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。<br>
当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),当我们进行数据修改的时候,就会修改存放在地址(指针) 上的值。<br>
</p>
<script>
var x; // x 为 undefined
console.log(x); // undefined
var x = 5; // 现在 x 为数字
console.log(x); // 5
var x = "liang"; // 现在 x 为字符串
console.log(x); // liang
// 声明新变量时, 可以使用关键词 "new" 来声明其类型:
var carname = new String; // 声明一个字符串类型
var x = new Number; // 声明一个数字类型
var y = new Boolean; // 声明一个布尔类型
var cars = new Array; // 声明一个数组类型
var person = new Object; // 声明一个对象类型
// 基本数据类型(扩展)
function a(s) { //定义以s为参数的函数,返回s的值
s = 100;
return s;
}
var y = 1;
a(y); //y作为参数调用函数a
console.log(y); //y还是为 1
// 复杂数据类型
function student(age, name, agrde) {
this.age = age;
this.name = name;
this.score = agrde;
}
var s1 = new student(18, "liang", 2); //创建一个student对象
console.log(s1); // student {age: 18, name: "liang", score: 2}
function a(s) {
s.name = "椋椋夜色";
}
a(s1) //把s1赋给s
console.log(s1.name); //输出 : 椋椋夜色
</script>
</body>
</html>