博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JS基础】初谈JS现有的数据类型
阅读量:5762 次
发布时间:2019-06-18

本文共 3050 字,大约阅读时间需要 10 分钟。

前言

在《你所不知道的javascript上篇》书籍 以及《javascript权威指南》等书籍里面, 均有介绍js的数据类型,对象,原型,继承。结合工作经验, 以及借用一些开源库和框架的源码, 进行一次梳理。 首先介绍数据类型 ~~

数据类型

js 目前有以下几大数据类型

  • undefined
  • null
  • string
  • boolean
  • number
  • symbol (ES6新增)
  • object

undefined类型

原始值类型. 表示某个变量已经声明, 但是未分配内存空间给予该变量.

var foo; console.log(foo); /* 申明变量, 却没有赋值 */
function bar (a) {  console.log(a); /* 函数形参声明, 却没有对应实参赋值 */}bar();
function foo2 () {}var bar2 = foo2(); /* 函数无return 或者, return 不带任何返回值 */
var o = {foo: 'foo'}console.log(o.bar); /* 在对象中寻找不存在的属性 */
var foo = 'foo';foo = undefined; /* 显示将某个变量指向undefined, 消除引用标记 */

null 类型

原始值类型. 声明变量此时为一个空的原始值. 由于历史原因, 使用typeof null 返回 object表示为一个对象.

如果要验证一个变量是否为null, 可以有以下几种方式

function is_null (o) {  return o === null;}function is_null (o) {  return Object.prototype.toString.call(o) === '[object Null]';}

string类型

原始值类型. string属于不可变值类型, 当一个字符串进行相加后, 返回一个新的字符串引用。

var str = 'hello world';str = str + ' liyanlong';// 1. 栈内存 创建一个str变量// 2. 'hello wolrd' 内容存储在堆中, 并将引用赋给 str变量// 3. 获取str的变量引用, 与新字符串 ` liyanlong` 进行连接操作. 产生新的引用地址并传给str

简单理解: string 类型的内容与 object的 内容都存储在堆中。不同的一点是, 无法对string的堆进行修改, 任何连接,分割字符串的操作都会产生一个新的堆引用。

boolean 类型

原始值类型, 只有true, false 两个原始值.

typeof true // booleantypeof false // boolean

number 类型

原始值类型. 存储一切数值类型, 包括正负数, 整数, 小数, 科学计数.

typeof NaN // numbertypeof Infinity // numbertypeof 0 // numbertypeof 1e2 // numbertypeof -0.5 // number

检查一个变量是否可成为无法成为合法的 number 类型

window.isNaN('12') // falsewindow.isNaN('foo') // true

检查number是否为有限的number(非无穷)值

window.isFinite('123') // truewindow.isFinite(Infinity) // false

symbol类型

原始值类型. 属于ES6新增的一种数据类型. ES6允许属性的keysymbol类型. 以此可以提供一个私有的属性

let obj = (function () {    let key = Symbol('你好');    let obj = {    };    obj[key] = '私有变量';    return {        get foo () {            return this[key];        }    };})();obj.foo = 'hello world';console.log(Object.getOwnPropertyNames(obj)); // ['foo']console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(你好)]let anotherKey = Symbol('你好');console.log(obj[anotherKey]) // undefinedtypeof anotherKey // 'symbol'

object类型

引用类型. js中常见的引用对象 有Array, Object, Date.

var arr = [];var o = {};var date = new Date()typeof o // objecttypeof arr // objecttypeof date // object

函数也属于对象类型, 它是一种可调用的对象, 并且能创建调用栈执行内部代码. 只是函数在执行typeof 时,返回的是function

function Foo() {}typeof Foo // function Foo instanceof Object // true

值类型与引用类型

值类型属于不可变类型, 由于具有固定长度大小, 因此可以存放在栈内存中,而引用类型属于可变类型, 一个对象可以赋予多个属性及值,属性值又可以为一个新的引用对象。因此将引用类型存放在堆中

包装类型

为了方便boolean, number, string 基本类型的处理及调用, 当我们在执行toString(), valueOf(), +操作符 以及函数方法的时候, 会隐世转换为Boolean,Number, String对象类型. 执行后返回的又是基本类型。

var bool = truevar number = 1var string = 'hello world'console.log(bool + number) // 2// 相当于console.log(Boolean(bool).valueOf() + number) // 2console.log(bool + string) // true hello world// 相当于console.log(Boolean(bool).toString() + string) // true hello worldstring.charAt(0) // h// 相当于console.log(String(string).charAt(0)) // h// 基础类型不属于包装的对象类型bool instanceof Boolean // falsenumber instanceof Number // falsestring instanceof String // false

小结

数据类型是每一个语言的基础. 由于js属于弱类型脚本语言, 因此数据只有在赋值后才能直到变量的数据类型. 下一次我们具体介绍js对象的概念.

转载地址:http://zvwux.baihongyu.com/

你可能感兴趣的文章
大数据迎来节能时代
查看>>
CRM是企业营销制胜的王道
查看>>
若无法走上数字化转型之路,CIO将被“边缘化”
查看>>
中国研发出勒索病毒防御软件 能阻止其破坏文件
查看>>
关于勒索软件防御,你需要知道的几个事实
查看>>
《淘宝店铺 大数据营销+SEO+爆款打造 一册通》一一1.3 客单价
查看>>
《Hadoop与大数据挖掘》一2.1.3 Hadoop计算—MapReduce
查看>>
Python Web 应用:WSGI基础
查看>>
《关系营销2.0——社交网络时代的营销之道》一第1章 克服恐惧,开始关系营销...
查看>>
fastjson 1.2.33 发布,Java 的 JSON 处理器
查看>>
《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——1.1节智能手机世界...
查看>>
《语义网基础教程(原书第3版)》—— 第2章 描述万维网资源:RDF
查看>>
ES6的箭头函数
查看>>
Cache-Control for Civilians
查看>>
解决小程序 callback hell
查看>>
【算法题】最大连续子序和
查看>>
前端优化常用技术心得
查看>>
JS正则表达式-学习笔记
查看>>
为什么我们一直没有遇到外星人?
查看>>
搜集到的Weex 相关资料
查看>>