【JS】JavaScript:基本类型/值类型/引用类型/弱类型

数据类型

JavaScript中变量是要区分数据类型的。

'12'(注意引号)和12一样么?

12+5 //17 '12'+'5' //125

为什么呢?

试一试用 typeof 获取他们的类型:

typeof 12 //number typeof '12' //string

String字符串

代表一段文本内容。传统上都是用用单引号(' ')或双引号(" ")包裹。

同时,单引号和双引号还可以嵌套(注意:是嵌套,“单套双,双套单”都可以,但不能“双套双”):

'"大"神"小"班' "'大'神'小'班"

这样能解决很多问题,但还是不方便,比如:

  • 换行(使用非打印符:n,t等),类似的还有x41(ASCII),u4e2du6587(Unicode),_复习:_字符编码

  • 输出这种:'大'神"小"班(使用转义:",",等)

所以,ES6推出了反引号(``),在键盘上数字1前面,Tab键上方,可以完美的解决上述问题,可以:

  • 直接使用引号换行等

    var slagon = '大'神"小"班; 灵活学制! ;

  • 使用模板字符串:

    var student = '王枫'; alert(Hello,${student}!);

演示……

Number数值

包括:整数/小数/正数/负数

可以直接用阿拉伯数字表示,也可以用:

  • 科学计数法,如:986e-2 => 9.86
  • 字母Infinity,表示“无穷大”,@想一想@:无穷小呢?
  • NaN(Not a Number),后文详述

boolean布尔值

表示是否满足条件。

  • 条件成立,为“真”,用true表示
  • 条件不成立,为“假”,用false表示

object对象

本质上就是一组由键值对组成的无序集合:

var student = { //花括号界定 name: '王枫', //逗号分隔 age: 21, //冒号赋值 "is-Female": true //非规范的属性名,出现了 “-” };

有可以直接把变量放到对象中,这样对象就会以变量名为属性名称,变量值为属性值进行重构:

var age = '21'; var obj = {age}; //等于:{age: 21}

可以使用点(.)或者方括号([])取出对象中元素/成员的值:

student.age
student["name"]

undefined和Null

“变量未赋值前值为undefined”,照理说,undefined应该是一个“值”。但是,无论是JavaScript文档,还是用typeof检测,undefined都是一个类型:

typeof undefined //"undefined"

null就更扯淡了:

typeof null //"object"

区分“未定义”和“空”,实质上并没有什么卵用,除了把问题搞得更复杂——但是,这就是JavaScript,ʅ(‾◡◝)ʃ

值/引用类型

让我们来看这么一段代码:

var a = 23; var b = a; //把a的值赋值给b b = 39; console.log(a); //a的值是多少?

为什么b不会影响a呢?或者,稍微改一改:

var wpz = { age: 23 }; var atai = wpz; atai.age = 18; console.log(wpz.age);

为什么该atai的age由会影响wpz呢?

因为a和b都是值(原始)类型,wpz和atai都是引用(object)类型。

  • 值类型包括:Undefined、Null、Boolean、Number 和 String(注意string!)
  • 引用类型包括:Object

本来可以简单的记忆:Object都是引用,非Object都是值,但是和null又在那里搞事情……

【JS】JavaScript:基本类型/值类型/引用类型/弱类型

把一个变量A赋值给另一个变量B,都是:把A变量中存储的值copy一份,赋予给B。

但是,

  • 值类型变量中存储的是“值”
  • 引用类型变量当中存放的是“引用”,即一个对象的地址,而不是对象本身。

所以,值类型变量的改动只影响自己;引用类型的改动影响对象,从而影响所有指向该对象的变量:如上图所示。

PPT演示讲解

注意:这种说法,

  • 值类型数据存放在“栈”中
  • 引用类型数据存放在“堆”中

是错误的,至少是不严谨的。

不管是值类型还是引用类型,变量都是存放在栈中

只是:

  • (在栈中的)值类型变量直接(在栈中)存放值;
  • 引用类型变量仍然在栈中,但它引用的对象存放在堆中。

堆和栈都是数据结构,参考:

弱类型

JavaScript是一种弱/动态类型语言。

  • 所谓“弱”类型,不是“没”类型,而是“不严格要求”类型匹配。
  • 所谓“动态”类型,是指变量的类型可以“动态”的变化

表现为:一个变量可以被多种类型的值赋值:

var slagon = "大神小班"; console.log(typeof slagon); //这时候是string类型 slagon = 888; //可以的! console.log(typeof slagon); //这时候是number类型了

@想一想@:

  • 都弱类型了,为什么要区分数据类型?
  • 弱类型和C#中的类型转换有何区别?
  • 弱类型好不好?

作业

  1. 观察“一起帮”的求助,定义一个problem对象,其中包含title、body、reward、needRemote等属性
  2. 用代码和PPT演示:

    • 弱类型的特点
    • 值类型和引用类型的区别

以上是 【JS】JavaScript:基本类型/值类型/引用类型/弱类型 的全部内容, 来源链接: utcz.com/a/87941.html

回到顶部