位置: 编程技术 - 正文

JavaScript内核之基本概念(javascript核心技术)

编辑:rootadmin
本章主要讲述JavaScript中的数据类型(基本类型与引用类型),变量(包括变量的作用域),操作符(主要是一些较为常见,但是不容易从字面上理解的操作符)。由于JavaScript中的“一切皆对象”,在掌握了这些基本的概念之后,读者就可以较为轻松的理解诸如作用域,调用对象,闭包,currying等等较难理解的概念了。 数据类型 有程序设计经验的读者肯定知道,在C或者Java这样的语言中,数据是有类型的,比如用以表示用户名的属性是字符串,而一个雇员的年龄则是一个数字,表示UI上的一个开关按钮的数据模型则为布尔值等等,对数字可能还可以细分为浮点数,整型数,整型数又可能分为长整型和短整型,总而言之,它们都表示语言中的数据的值的类型。 JavaScript中的数据类型分为两种:基本数据类型和对象类型,其中对象类型包含对象,数组,以及函数(事实上,函数,数组等也都是对象,这个在后边的章节详述)。 1.1.1 基本数据类型 在JavaScript中,包含三种基本的数据类型,字符串(String),数值(Number),布尔值(boolean),下面是一些简单的例子: 我们可以分别查看变量的值及变量的类型: 注意,在此处使用的print()函数为rhino解释器的顶层对象的方法,可以用来打印字符串,通常情况下,在客户端,程序员多使用alert()进行类似的动作,alert()是浏览器中JavaScript解释器的顶层对象(window)的一个方法。 Hello, world 2.3 true string number number Boolean 在JavaScript中,所有的数字,不论是整型浮点,都属于“数字”基本类型。typeof是一个一元的操作符,在本章的另外一个小节会专门讲到。 1.1.2 对象类型 这里提到的对象不是对象本身,而是指一种类型,我们在第三章会对对象进行详细的讨论,此处的对象包括,对象(属性的集合,即键值的散列表),数组(有序的列表),函数(包含可执行的代码)。 对象类型是一种复合的数据类型,其基本元素由基本数据类型组成,当然不限于基本类型,比如对象类型中的值可以是其他的对象类型实例,我们通过例子来说明: 可以看到,对象具有属性,如obj.str, obj.num,这些属性的值可以是基本类型,事实上还可以更复杂,我们来看看他们的类型: 读者可能会对print(typeof array)打印出object感到奇怪,事实上,对象和数组的界限并不那么明显(事实上它们是属于同一类型的),但是他们的行为却非常不同,本书的后续章节将两个重要的数据类型做了分别介绍。 2.1.3 两者之间的转换 类似与Java中基本数据类型的自动装箱拆箱,JavaScript也有类似的动作,基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。我们可以通过几个例子来说明: str为一个字符串,通过typeof运算符可知其type为”string”,而: 可知,str2的type为”object”,即这两者并不相同,那么为什么可以使用str.length来的到str的长度呢?事实上,当使用str.length时,JavaScript会自动包装一个临时的String对象,内容为str的内容,然后获取该对象的length属性,最后,这个临时的对象将被释放。 而将对象转换为基本类型则是通过这样的方式:通过调用对象的valueOf()方法来取得对象的值,如果和上下文的类型匹配,则使用该值。如果valueOf取不到值的话,则需要调用对象的toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。由于JavaScript是弱类型的,所以JavaScript引擎需要根据上下文来“猜测”对象的类型,这就使得JavaScript的效率比编译型的语言要差一些。 valueOf()的作用是,将一个对象的值转换成一种合乎上下文需求的基本类型,toString()则名副其实,可以打印出对象对应的字符串,当然前提是你已经“重载”了Object的toString()方法。 事实上,这种转换规则会导致很多的问题,比如,所有的非空对象,在布尔值环境下,都会被转成true,比如: 初学者容易被JavaScript中的类型转换规则搞晕掉,很多情况下会觉得那种写法看着非常别扭,其实只需要掌握了规则,这些古怪的写法会大大的提高代码的性能,我们通过例子来学习这些规则: 通常可以在JS代码中发现这样的代码: 这种写法事实上具有更深层次的含义: 应该注意到,datamodel.item是一个对象(字符串,数字等),而if需要一个boolean型的表达式,所以这里进行了类型转换。在JavaScript中,如果上下文需要boolean型的值,则引擎会自动将对象转换为boolean类型。转换规则为,如果该对象非空,则转换为true,否则为false.因此我们可以采取这种简写的形式。 而在传统的编程语言(强类型)中,我们则需要: 2.1.4类型的判断 前面讲到JavaScript特性的时候,我们说过,JavaScript是一个弱类型的语言,但是有时我们需要知道变量在运行时的类型,比如,一个函数的参数预期为另一个函数: 当调用handleMessage的函数传递的handle不是一个函数则JavaScript引擎会报错,因此我们有必要在调用之前进行判断: 但是,typeof并不总是有效的,比如下面这种情况: 运行结果显示,对象obj和数组array的typeof值均为”object”,这样我们就无法准确判断了,这时候,可以通过调用instanceof来进行进一步的判断: print(obj instanceof Array);//false print(array instanceof Array);//true 第一行代码返回false,第二行则返回true。因此,我们可以将typeof操作符和instanceof操作符结合起来进行判断。 2.2 变量 变量,即通过一个名字将一个值关联起来,以后通过变量就可以引用到该值,比如: 当我们下一次要引用”Hello, Wrold”这个串进行某项操作时,我们只需要使用变量str即可,同样,我们可以用*num来表示*2.。变量的作用就是将值“存储”在这个变量上。 2.2.1基本类型和引用类型 在上一小节,我们介绍了JavaScript中的数据类型,其中基本类型如数字,布尔值,它们在内存中都有固定的大小,我们通过变量来直接访问基本类型的数据。而对于引用类型,如对象,数组和函数,由于它们的大小在原则上是不受任何限制的,故我们通过对其引用的访问来访问它们本身,引用本身是一个地址,即指向真实存储复杂对象的位置。 基本类型和引用类型的区别是比较明显的,我们来看几个例子: 运行结果如下: 1 1 2 1 这样的运行结果应该在你的意料之内,没有什么特别之处,我们再来看看引用类型的例子,由于数组的长度非固定,可以动态增删,因此数组为引用类型: 引用指向的是地址,也就是说,引用不会指向引用本身,而是指向该引用所对应的实际对象。因此通过修改array指向的数组,则arrayRef指向的是同一个对象,因此运行效果如下: 1,2,3,4,5,6 2.2.2变量的作用域 变量被定义的区域即为其作用域,全局变量具有全局作用域;局部变量,比如声明在函数内部的变量则具有局部作用域,在函数的外部是不能直接访问的。比如: 应该注意的是,在函数内var关键字是必须的,如果使用了变量而没有写var关键字,则默认的操作是对全局对象的,比如: 由于函数func中使用variable而没有关键字var,则默认是对全局对象variable属性做的操作(修改variable的值为in),因此此段代码会打印: in in 2.3运算符 运算符,通常是容易被忽略的一个内容,但是一些比较古怪的语法现象仍然可能需要用到运算符的结合率或者其作用来进行解释,JavaScript中,运算符是一定需要注意的地方,有很多具有JS编程经验的人仍然免不了被搞得晕头转向。 我们在这一节主要讲解这样几个运算符: 2.3.1中括号运算符([]) []运算符可用在数组对象和对象上,从数组中按下标取值: 而[]同样可以作用于对象,一般而言,对象中的属性的值是通过点(.)运算符来取值,如: 但是考虑到这样一种情况,我们在遍历一个对象的时候,对其中的属性的键(key)是一无所知的,我们怎么通过点(.)来访问呢?这时候我们就可以使用[]运算符: 运行结果如下: field:slef printInfo:function (){ print(this.field); } 2.3.2点运算符(.) 点运算符的左边为一个对象(属性的集合),右边为属性名,应该注意的是右边的值除了作为左边的对象的属性外,同时还可能是它自己的右边的值的对象: 这个例子中,outter作为object的属性,同时又是printInnerText()的对象。 2.3.3 == 和 === 以及 != 和 !== 运算符==读作相等,而运算符===则读作等同。这两种运算符操作都是在JavaScript代码中经常见到的,但是意义则不完全相同,简而言之,相等操作符会对两边的操作数做类型转换,而等同则不会。我们还是通过例子来说明: print(1 == true); print(1 === true); print("" == false); print("" === false); print(null == undefined); print(null === undefined); 运行结果如下: 相等和等同运算符的规则分别如下: 相等运算符 如果操作数具有相同的类型,则判断其等同性,如果两个操作数的值相等,则返回true(相等),否则返回false(不相等). 如果操作数的类型不同,则按照这样的情况来判断: ◆ null和undefined相等 ◆ 其中一个是数字,另一个是字符串,则将字符串转换为数字,在做比较 ◆ 其中一个是true,先转换成1(false则转换为0)在做比较 ◆ 如果一个值是对象,另一个是数字/字符串,则将对象转换为原始值(通过toString()或者valueOf()方法) ◆ 其他情况,则直接返回false 等同运算符 如果操作数的类型不同,则不进行值的判断,直接返回false 如果操作数的类型相同,分下列情况来判断: ◆ 都是数字的情况,如果值相同,则两者等同(有一个例外,就是NaN,NaN与其本身也不相等),否则不等同 ◆ 都是字符串的情况,与其他程序设计语言一样,如果串的值不等,则不等同,否则等同 ◆ 都是布尔值,且值均为true/false,则等同,否则不等同 ◆ 如果两个操作数引用同一个对象(数组,函数),则两者完全等同,否则不等同 ◆ 如果两个操作数均为null/undefined,则等同,否则不等同 比如: 会返回: true true 再来看一个对象的例子: 返回值为: true false obj1是一个对象,而obj2是一个结构与之完全不同的字符串,而如果用相等操作符来判断,则两者是完全相同的,因为obj1重载了顶层对象的toString()方法。 而!=不等和!==不等同,则与==/!==相反。因此,在JavaScript中,使用相等/等同,不等/不等同的时候,一定要注意类型的转换,这里推荐使用等同/不等同来进行判断,这样可以避免一些难以调试的bug。

推荐整理分享JavaScript内核之基本概念(javascript核心技术),希望有所帮助,仅作参考,欢迎阅读内容。

JavaScript内核之基本概念(javascript核心技术)

文章相关热门搜索词:javascript核心,javascript的内置函数有哪些,javascript核心技术,js内核是什么,js内核是什么,javascript的核心组成部分,内部javascript,js内核是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript入门之对象与JSON详解 JavaScript对象与传统的面向对象中的对象几乎没有相似之处,传统的面向对象语言中,创建一个对象必须先有对象的模板:类,类中定义了对象的属性和

JavaScript入门之基本函数详解 总的来说,函数在JavaScript中可以:◆被赋值给一个变量◆被赋值为对象的属性◆作为参数被传入别的函数◆作为函数的结果被返回◆用字面量来创建函

JavaScript入门之事件、cookie、定时等 一篇关于JavaScript语言入门的文章涵盖了JavaScript语言中许多最基础的内容,从创建脚本标签到使用注释、把JavaScript文件包含到HTML文档中、定义变量、使

标签: javascript核心技术

本文链接地址:https://www.jiuchutong.com/biancheng/380544.html 转载请保留说明!

上一篇:JavaScript入门之语言基础第1/2页(js 入门)

下一篇:JavaScript入门之对象与JSON详解(javascript教程chm)

  • 什么是应付职工薪酬设定提存计划
  • 旅游交什么税
  • 咨询合同按什么交印花税
  • 其他应收款平账怎么做分录
  • 滞留票税务局会罚款多少
  • 交易性金融资产的账务处理
  • 计划成本法会计分录例题
  • 共同控制合营企业
  • 工会经费计提多了跨年
  • 生产成本直接材料包括哪些
  • 公司出让土地是利好
  • 年末有留抵税额怎么做税费对冲
  • 资产损失类型有哪些
  • 装修公司在装修完后增加费用
  • 增值税发票如何读入金税盘
  • 增值税普通发票需要交税吗
  • 印花税按次申报是什么意思
  • 旅行社差额征税增值税申报表怎么填
  • 企业所得税收入是含税还是不含税
  • 专项应付款现在叫什么
  • 银行没有流水怎么开证明
  • 转让长期股权投资怎么算
  • 冲减多计提的工会经费调账说明
  • 月末库存商品怎么记账
  • 公司运输车辆加油会计分录
  • lsass.exe是什么进程
  • win11系统语言修改不了
  • win10电脑设备管理器在哪
  • 发财树的养殖方法和浇水时间
  • 最贵的冰箱是多少钱
  • 木质家具出口
  • php数组操作
  • 建筑业营改增后税务问题
  • 电子税务局增值税申报流程
  • 编写一个php程序,展示双引号和单引号的区别
  • 如何自定义smartart
  • 购入多项固定资产
  • 元宇宙与nft
  • python 微信红包
  • 餐饮固定成本怎么算的
  • dpkg --list
  • 销售旧货和销售使用过的物品税率
  • 织梦怎么改网站主页
  • 理财产品怎么分类总结
  • 企业按行业划分可划分为哪些
  • 长期待摊费用借方负数什么意思
  • 分组计数什么意思
  • sql服务器无法启动的解决
  • 企业所得税季度申报表怎么填
  • 制造费用期末要结转吗
  • 超期应收款管控
  • 零售行业折扣销售方案
  • 本月多交的增值税
  • 销售开票怎么做会计分录
  • 融资租入固定资产属于本企业资产
  • sqlserver多表查询怎么加索引
  • sql union和join区别
  • 电脑系统文件受损
  • 系统维护的主要内容有哪些
  • windows10x预览版
  • linux如何列出所有用户
  • linux中添加用户和组的操作
  • win7任务栏右下角图标空白解决办法
  • centos 7 远程桌面
  • win7如何设置屏幕不黑屏
  • linux 怎么样
  • #pragma UNROLL 4
  • vue的ssr渲染
  • dedecms建站操作
  • js如何显示日期和时间
  • js中不同的height, top的区别对比
  • shell的变量分为哪三种
  • javascript怎么学
  • linearlayout布局怎么设置
  • JavaScript中的6种运算符总结
  • js 类继承
  • 使用androidx
  • 税务行业微信缴税项目是什么
  • 未清卡会锁死吗?
  • 注册地址和税务登记可以不一致吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设