一篇文章带你进修js数据类型

走在前端的大道上

本篇将本身读过的相干 javascript 数据范例 文章中,对本身有启示的章节片断总结在这(会对原文举行编削),会不断丰富提炼总结更新。

数据范例

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 // boolean
typeof false // boolean

number 范例

原始值范例. 存储统统数值范例, 包含正负数, 整数, 小数, 科学计数.

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

搜检一个变量是不是可成为没法成为正当的 number 范例

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

搜检number是不是为有限的number(非无限)值

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

symbol范例

原始值范例. 属于ES6新增的一种数据范例. ES6许可属性的key 为 symbol范例. 以此能够供应一个私有的属性

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]) // undefined
typeof anotherKey // 'symbol'

object范例

援用范例. js中常见的援用对象 有Array, Object, Date.

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

函数也属于对象范例, 它是一种可挪用的对象, 并且能建立挪用栈实行内部代码. 只是函数在实行typeof 时,返回的是function

function Foo() {
}

typeof Foo // function 
Foo instanceof Object // true

值范例与援用范例

值范例属于不可变范例, 因为具有牢固长度大小, 因而能够存放在栈内存中,而援用范例属于可变范例, 一个对象能够给予多个属性及值,属性值又能够为一个新的援用对象。因而将援用范例存放在堆中

包装范例

为了轻易boolean, number, string 基本范例的处置惩罚及挪用, 当我们在实行toString(), valueOf(), +操纵符 以及函数要领的时刻, 会隐世转换为Boolean,Number, String对象范例. 实行后返回的又是基本范例。

var bool = true
var number = 1
var string = 'hello world'

console.log(bool + number) // 2
// 相当于
console.log(Boolean(bool).valueOf() + number) // 2

console.log(bool + string) // true hello world
// 相当于
console.log(Boolean(bool).toString() + string) // true hello world

string.charAt(0) // h
// 相当于
console.log(String(string).charAt(0)) // h

// 基本范例不属于包装的对象范例
bool instanceof Boolean // false
number instanceof Number // false
string instanceof String // false

参考文章:
1.【JS基本】初谈JS现有的数据范例

    原文作者:于梦中2010
    原文地址: https://segmentfault.com/a/1190000013277770
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞