浅谈JavaScript中的数据类型

简介: 浅谈JavaScript中的数据类型

const声明


const的行为与let基本相同,唯一一个重要的区别就是用它声明变量的时候必须同时初始化变量,而且尝试修改const声明的时候会导致运行错误

<script>
  const  age = 36 ;
  age = 36 ;   //TypeError:给常量赋值
  //const也不允许重复声明
  const name = 'Matt';
  const name = 'DNEIOF';
  //const声明的作用域也是块
  const name = 'Matt';
  if(true){
      const name = 'huiijo';
  }
  console.log(name);   // Matt
</script>

const声明的限制只适用于它指向的变量的引用,换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制

<script>
  const  person = ();
  person.name = 'Matt';  // ok
</script>

JavaScript引擎会为for循环中的let声明分别创建独立的变量实例,虽然const变量跟let变量很相似,但是不能用const来声明迭代变量

for (const i = 0 ; i <  10 ; ++i){}    // TypeError:给常量赋值

不过,如果你只想用const声明一个不会被修改的for循环变量,那也是可以的,换句话说,每次迭代只是创建一个新变量,这对for-offor-in循环特别有意义

<script>
        let i = 0;
        for (const j = 7; i < 5; ++i) {
            console.log(i);          //  7 7 7 7 7
        }
        for (const key in {a: 1, b: 2}) {
            console.log(key);  // a,b
        }
        for (const value of [1, 2, 3, 4, 5]) {
            console.log(value);   // 1,2,3,4,5
        }
    </script>


声明风格及最佳实践


ECMAScript 6增加了letconst,从客观上为这门语言更精确地声明作用域和语义提供了更好的支持,行为怪异的var所造成的各种问题


不使用var


有了letconst,大部分开发者会发现自己不再需要var了,限制自己只使用letconst,有助于提升自己的代码质量,因为变量有了明确的作用域、声明位置,以及不变的值


数据类型


ECMAScript有6种简单的数据类型(原始类型):UndefinedNullBooleanNumberStringSymbol(符号)是在ECMAScript 6新增的,还有一种类型叫Object(对象),Object是一种无序名值对的集合,这是因为在ECMAScript中不能定义自己的数据类型,所有的值都用以上7种数据类型之一来表示


typeof操作符


因为ECMAScript的类型系统是松散的,所以需要一种手段来确定任意变量的数据类型,typeof操作符就是为此而生的,对一个值使用typeof操作符会返回下列字符串之一

“undefined” 表示值未定义
"boolean" 表示值为布尔值
"string" 表示值为字符串
"number" 表示值为数值
"object" 表示值为对象(而不是函数)或null
"function" 表示值为函数
"symbol" 表示值为符号
<script>
    let message = "some thing";
    console.log(typeof message);   //"string"
    console.log(typeof (message));  //"string"
    console.log(typeof 95);  "number"
</script>

我们可以发现,在这个例子中,把一个变量(message)和一个数值字面量传给了typeof操作符。此刻的typeof是一个操作符而不是函数,因此不需要参数


注意


严格来说,函数在ECMAScript中被认为是对象,并不代表是一种数据类型。可是,函数也有其自己的特殊的属性,为此就有必要通过typeof操作符来区分函数和其它对象


Undefined类型


Undefined类型只有一个值,就是特殊值Undefined,当我们使用var或者let没有初始化变量的时候,就相当于给变量赋予了一个undefined

<script>
    let message ;
    console.log(message == undefined);
</script>

在这个例子中,变量message在声明的时候并未初始化,而在比较它和undefined的字面值时,两者是相等的,这个例子等同于下面的实例

<script>
    let message = undefined;
    console.log(message == undefined);
</script>

这里的变量message显示地以undefined来初始化,但这个是不必要的,因为在默认情况下,任何未经初始化的变量都会取得undefined


注意注意


一般来说,我们永远不用显式地给某个变量设置undefined值,字面值undefined主要用于比较,而且在ECMA-262第3版之前是不存在的,增加这个特殊值的目的就是为了正式明确空对象指针(null)和未初始化变量的区别

包含undefined值的变量和未定义变量之间是有区别的

<script>
    let message ;
    console.log(message);  // undefined
    console.log(age);   // 报错
</script>

在上面的例子中,第一个console.log绘制出变量message的值,即undefined。而第二个console.log要输出一个未声明的变量age的值,因此会导致报错,对于未声明的变量,只能执行第一个有用的操作,就是对它调出typeof

我们在对未初始化的变量调用typeof时,返回的结果是undefined,但对未声明的变量调用它时,返回的结果还是undefined,这个就让人很困惑

<script>
    let message ;
    console.log( typeof message);  // undefined
    console.log( typeof age);   // undefined
</script>

无论是声明还是未声明,typeof返回的都是字符串undefined,逻辑上都是对的,因为虽然严格来说这两个变量之间存在根本性差异,但是它们都无法执行实际操作。

undefined是一个假值,如果我们需要,可以用更简洁的方式检测它,不过也要记住,其它可能的值同样是假值,所以一定要明确自己想检测的就是undefined这个字面值,而不仅仅是假值

<script>
  let message;  // 这个变量被声明了,只是值为undefined
  // age没有声明
  if(message){
      //这个块不会执行
  }
  if(!message){
      //这个块会执行
  }
  if(age){
      //这里会报错
  }
</script>


相关文章
|
3月前
|
存储 JavaScript 对象存储
js检测数据类型有那些方法
js检测数据类型有那些方法
143 59
|
8天前
|
存储 JavaScript 前端开发
JavaScript中的数据类型以及存储上的差别
通过本文的介绍,希望您能够深入理解JavaScript中的数据类型及其存储差别,并在实际编程中灵活运用这些知识,以提高代码的性能和稳定性。
33 3
|
1月前
|
存储 JavaScript 前端开发
js中的数据类型
JavaScript 中的数据类型包括五种基本类型(String、Number、Undefined、Boolean、Null)和三种引用类型(Object、Array、Function,以及ES6新增的Symbol)。基本类型直接存储值,引用类型存储的是指向实际数据的内存地址。了解它们的区别对于掌握 JavaScript 的变量赋值和函数传参至关重要。
21 1
|
2月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
112 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
2月前
|
JavaScript 前端开发 开发者
【干货拿走】JavaScript中最全的数据类型判断方法!!!!
【干货拿走】JavaScript中最全的数据类型判断方法!!!!
28 1
|
2月前
|
存储 JavaScript 前端开发
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
49 0
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-基本数据类型和引用数据类型
关于JavaScript基础知识的文章,主要介绍了基本数据类型和引用数据类型。
44 2
JavaScript基础知识-基本数据类型和引用数据类型
|
3月前
|
存储 前端开发 JavaScript
前端基础(三)_JavaScript数据类型(基本数据类型、复杂数据类型)
本文详细介绍了JavaScript中的数据类型,包括基本数据类型(Number、String、Boolean、Undefined、Null)和复杂数据类型(Object),并解释了如何使用`typeof`操作符来识别变量的数据类型。同时,还讨论了对象、函数和数组等复杂数据类型的使用方式。
69 2
|
4月前
|
JavaScript 前端开发
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
这篇文章是JavaScript基础与实战教程的第一部分,涵盖了JavaScript的基本语法、标识符、数据类型以及如何进行强制类型转换,通过代码示例介绍了JS的输出语句、编写位置和数据类型转换方法。
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
|
4月前
|
开发者 图形学 开发工具
Unity编辑器神级扩展攻略:从批量操作到定制Inspector界面,手把手教你编写高效开发工具,解锁编辑器隐藏潜能
【8月更文挑战第31天】Unity是一款强大的游戏开发引擎,支持多平台发布与高度可定制的编辑器环境。通过自定义编辑器工具,开发者能显著提升工作效率。本文介绍如何使用C#脚本扩展Unity编辑器功能,包括批量调整游戏对象位置、创建自定义Inspector界面及项目统计窗口等实用工具,并提供具体示例代码。理解并应用这些技巧,可大幅优化开发流程,提高生产力。
440 1