位置: 编程技术 - 正文

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)

  • 减资需要交个税吗
  • 行政事业单位决算编制流程图
  • 培训费用属于
  • 总公司汇总缴纳所得税升为一般纳税人分公司受影响吗
  • 新会计准则中计提减值如何回转
  • 股东无偿借款给公司需要交税吗
  • 收到外商投入资金
  • 免费赠送物业费活动语句怎么写
  • 企业缴存公积金比例
  • 一般纳税人证明在哪里打印
  • 汇算所得税中“以前年度多缴的所得税额在本年抵减额”怎么填 ?
  • 7月1日发票新规定
  • 销售成本结转账务处理
  • 慰问金怎么入账科目
  • 哪些外籍个人应在中国缴纳个税?
  • 子公司向母公司借款
  • 代开的普通发票如何盖章?
  • 递延收益的账务处理案例
  • 腾讯手游助手遇到未知错误
  • 赠与合同任意撤销与法定撤销的区别
  • 数人侵权行为的类型
  • 索尼笔记本电脑官网
  • 一个非常好看的中秋礼物怎么做
  • 银行的抵债资产有几种处置办法
  • 绿萝怎么养才能爬藤
  • 第4章 数据处理思维导图
  • 黄金期货交易要怎么样
  • 集团公司管理费提取办法
  • wordpress如何使用
  • 在途物资运费会计科目怎么写
  • 房屋装修各项费用比例
  • php imagecopy
  • wordpress调用指定文章
  • 应收账款应付账款属于什么科目
  • 买保安服装
  • nginx搭建静态资源服务器
  • YOLOv5 + StrongSORT with OSNet
  • css选择器权重
  • 行政单位其他应付款
  • 坏账准备备案申请资料
  • 个体工商户建账办法最新
  • 捐赠商品分录
  • 坏账准备计提范围包括
  • mysql中join的用法
  • 税控服务费减免会计分录
  • 视同销售的会计处理是指?
  • 2021发票认证
  • 印花税减征比例
  • mysql客户端程序的功能是什么
  • 预付款已经开了发票未到货要怎么做账
  • 调整以前年度少计收入
  • 工会会计固定基金
  • 在非企业合并形成的长期股权投资中
  • 长期应付款的会计编号
  • 销售费用现金支出预算
  • 甲企业于2019年3月1日以2000万元取得乙上市公司
  • 金蝶如何删除结转损益的凭证
  • 税控盘减免税款需要结转吗
  • 税控盘网上抄报税的步骤
  • 营业利润率公式计算公式
  • mysql5.7免安装版
  • fedora改密码
  • 7款应用最广泛的游戏
  • ttf字体怎么转itz
  • 如何彻底删除超级QQ秀
  • win81with update
  • win10系统怎么添加ip地址
  • android ui绘制
  • 批量管理远程桌面
  • three.js入门教程(合集)
  • python常用操作运算符
  • redis基础教程
  • javascriptz
  • jquery多级联动下拉菜单
  • 陕西电子税务局官网登录入口网址
  • 上海各区税务大厅
  • 江苏发票真伪查询
  • 潍坊昌邑售房信息
  • 廉租房取消之后有什么补贴
  • 税务变更表
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设