JS ES5创建常量详解

 更新时间:2022年07月01日 08:47:06   作者:德育处主任   
这篇文章主要介绍了JS ES5创建常量详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

前言

ES6 刚推出的时候,letconst应该是大多数人学习ES6的第一个知识点。

其中const可以用来定义 常量 ,将不需要改变的数据定义成一个常量。

但其实在ES6之前我们也是有办法定义常量的。

ES 5 创建常量

Object.defineProperty 的基础用法

ES6之前是没有const的,如果需要定义常量,可以使用Object.defineProperty

很多人知道Vue2使用 Object.defineProperty监听数据变化,但不一定知道 Object.defineProperty也可以用来定义常量。

Object.defineProperty方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。Object.defineProperty(obj, prop, descriptor)接收3个参数

  • obj: 要定义属性的对象。
  • prop: 要定义或修改的属性的名称或 Symbol
  • descriptor: 要定义或修改的属性描述符。

举个例子:

var LH = {}
Object.defineProperty(LH, 'name', {
  value: '雷猴'
})
console.log(LH) // 输出: {name: '雷猴'}
LH.name = '鲨鱼辣椒'
console.log(LH)  // 输出: {name: '雷猴'}

可以将上面的代码放到你的浏览器里试试。

为什么修改LH.name无效呢?因为descriptor除了value之外,还有其他属性,比如writable就可以用来定义该对象是否允许被修改,默认是false,也就是不能修改。

所以 LH.name = '鲨鱼辣椒'修改无效。

如果将writable改成true就可以修改了

var LH = {}
Object.defineProperty(LH, 'name', {
  value: '雷猴',
  writable: true // 允许修改
})
console.log(LH) // 输出: {name: '雷猴'}
LH.name = '鲨鱼辣椒'
console.log(LH)  // 输出: {name: '鲨鱼辣椒'}

创建常量

顺着上面的思路,如果我们把LH改成window,那是不是就可以在window上定义一个属性,而且该属性是全局的,定义后在什么地方都能调用。

Object.defineProperty(window, 'NAME', {
  value: '雷猴'
})
console.log(NAME) // 输出: 雷猴
NAME = '鲨鱼辣椒'
console.log(NAME) // 输出: 雷猴
window.NAME = '蟑螂恶霸'
console.log(NAME) // 输出: 雷猴

不管如何修改,NAME 都是最开始定义的值。

常量居然可以修改值?

上面创建的常量,value是一个基础数据类型的值。如果换成引用类型的值,那内容是可以修改的。

Object.defineProperty(window, 'NAME', {
  value: {
    nickname: '雷猴'
  }
})
console.log(NAME)
NAME.nickname = '鲨鱼辣椒'
console.log(NAME)

原因是,常量锁定的是定义时所指向的内存地址。

定义基础数据类型时,内存地址直接指向那个值。但定义引用类型时,内存地址存的是引用地址。所以常量的定义指的是引用地址不能修改

兼容性

使用 Object.defineProperty 定义常量时需要注意兼容性

到此这篇关于JS ES5创建常量详解的文章就介绍到这了,更多相关JS ES5创建常量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript中reduce方法的用法及使用场景

    JavaScript中reduce方法的用法及使用场景

    reduce()方法对数组中的每个元素按序执行一个提供的reducer函数,每一次运行 reducer会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值,今天我们就介绍一下reduce的几种简单使用场景,需要的朋友可以参考下
    2023-08-08
  • JavaScript错误处理之分析 Uncaught(in promise) error的原因及解决方案

    JavaScript错误处理之分析 Uncaught(in promise) error的

    在开发过程中,JavaScript的错误处理是一个老生常谈的话题,当应用程序发生未捕获的异常时,Uncaught(in promise) error是其中最常见的错误类型,这篇文章将从多个方面详细阐述这种错误类型的原因与解决方案,感兴趣的朋友一起看看吧
    2023-12-12
  • js正文内容高亮效果的实现方法

    js正文内容高亮效果的实现方法

    这篇文章介绍了js正文内容高亮效果的实现方法,有需要的朋友可以参考一下
    2013-06-06
  • 一个对于Array的简单扩展

    一个对于Array的简单扩展

    一个对于Array的简单扩展...
    2006-10-10
  • 解决Babylon.js中AudioContext was not allowed to start异常问题

    解决Babylon.js中AudioContext was not allowed&nbs

    这篇文章主要介绍了解决Babylon.js中AudioContext was not allowed to start异常问题方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • JavaScript数组各种常见用法实例分析

    JavaScript数组各种常见用法实例分析

    这篇文章主要介绍了JavaScript数组各种常见用法实例分析,包括数组的添加、删除、替换、还原等常见技巧,非常具有实用价值,需要的朋友可以参考下
    2015-08-08
  • laypage+SpringMVC实现后端分页

    laypage+SpringMVC实现后端分页

    这篇文章主要为大家详细介绍了laypage+SpringMVC实现后端分页,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 深入了解javascript 数组的sort方法

    深入了解javascript 数组的sort方法

    在javascript中,数组对象有一个有趣的方法sort,它接收一个类型为函数的参数作为排序的依据。这意味着开发者只需要关注如何比较两个值的大小,而不用管排序这件事内部是如何实现的
    2018-06-06
  • [Web]防止用户复制页面内容和另存页面的方法

    [Web]防止用户复制页面内容和另存页面的方法

    原理就是利用js控制一些复制等事件,但破解也简单,这里就不说了。
    2009-02-02
  • JS实现数组去重的11种方法总结

    JS实现数组去重的11种方法总结

    去重是开发中经常会碰到的一个热点问题,这篇文章主要介绍了JS中实现数组去重的11个方法总结,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-04-04

最新评论