JavaScript学习记录(1)

1.直接量和变量

直接量:数值(10、20)、逻辑值(true、false)、字符串(“xx”)、null、undefined、对象(存放数据的一个容器)、函数(方法)。

变量:指向直接量或其他变量。

2.数据

原生数据类型:

  • 数值(number):整数和小数(比如1和3.14)
  • 字符串(string):字符组成的文本(比如”Hello World”)
  • 布尔值(boolean):true(真)和false(假)两个特定值
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示无值,即此处的值就是“无”的状态。

注:ES6中新增Symbol和BigInt类型。

(1)Symbol代表创建后独一无二且不可变的数据类型,主要为了解决可能出现的全局变量冲突问题。

(2)BigInt初期我们无法表示大于2^{^{53}}-1的数,BigInt数据类型提供了一种方法来表示大于2^{^{53}}-1的整数。BigInt可以表示任意大的整数,BigInt数据类型比Number类型支持更大的整数值。

引用数据类型:

对象(object):各种值组成的集合

两种类型区别:

在于存储位置的不同

●原始数据类型直接存储在栈(stack)中的简单数据段,占据空间 小、大小固定,属于被频繁使用数据,所以放入栈中存储;在数据结构中,栈中数据的存取方式为先进后出。

●引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固 定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈 中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引 用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。 堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中,堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大 小来规定。 在操作系统中,内存被分为栈区和堆区:

●栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的 值等。其操作方式类似于数据结构中的栈。堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。

3.数据类型检测

(1)typeof:其中数组、对象、null 都会被判断为 object

console.log(typeof 3);                  //number
console.log(typeof false);              //boolean
console.log(typeof 'hello');            //string
console.log(typeof []);                 //object
console.log(typeof function(){});       //function
console.log(typeof {});                 //object
console.log(typeof undefined);          //undefined
console.log(typeof null);               //object

(2)instanceof:instanceof 可以正确判断对象的类型,其内部运行机制是判断在其 原型链中能否找到该类型的原型。instanceof 只能正确判断引用数据类型,而不能判断基本数据类型。instanceof 运算符可以用来测试一个对象在其原型链 中是否存在一个构造函数的 prototype 属性。

console.log(2 instanceof Number);     //false

console.log([] instanceof Array);     //true

(3) constructor:constructor 有两个作用,一是判断数据的类型,二是对象实例通过 constrcutor 对象访问它的构造函数。

console.log((2).constructor === Number);     //true

需要注意,如果创建一个对象 来改变它的原型,constructor 就不能用来判断数据类型了

function Wang(){};

Wang.prototype = new Array();

var w = new Wang();


console.log(w.constructor === Wang);     //false
console.log(w.constructor === Array);    //true

(4)Object.prototype.toString.call() :Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型。

注:

同样是检测对象 obj 调用 toString 方法,obj.toString()的结果和 Object.prototype.toString.call(obj)的结果不一样,这是为什 么?

这是因为 toString 是 Object 的原型方法,而 Array、function 等类 型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调 用 toString 方法时,根据原型链的知识,调用的是对应的重写之后的 toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串…),而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString() 不能得到其对象类型,只能将 obj 转换为字符串类型;因此,在想要 得到对象的具体类型时,应该调用 Object 原型上的 toString 方法。

4.null 和 undefined 区别

总的来说 nullundefined 都代表空,主要区别在于 undefined 表示尚未初始化的变量的值,而 null 表示该变量有意缺少对象指向。

  • undefined
    • 这个变量从根本上就没有定义
    • 隐藏式 空值
  • null
    • 这个值虽然定义了,但它并未指向任何内存中的对象
    • 声明式 空值

undefined 在 JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会 影响对 undefined 值的判断。我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。 当对这两种类型使用 typeof 进行判断时,Null 类型化会返回 “object”,这是一个历史遗留的问题。当使用双等号对两种类型的 值进行比较时会返回 true,使用三个等号时会返回 false

图引用自JavaScript 数据类型_w3cschool

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王富贵他妈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值