三、语句和严格模式

JavaScript程序由语句组成,语句遵守语法规则。

例如:if语句,while语句,with语句等等……

block块语句

常用于组合0~多个语句,块语句用{}定义

直接以花括号开头会被理解成块,如果想被理解为自变量表达式需要赋值或再套一个括号

需要注意没有块级作用域:

声明语句 var

需要注意的是我们可以再一个var语句里面定义多个变量

如var a=1,b=1

但是不能用var a=b=1

b会是一个隐式全局变量

try catch提供了一个异常捕获机制

执行的流程是首先执行try块中的代码,如果抛出了异常,由catch捕获并执行,如果没有异常则忽略,finally中的语句都会执行,try后面必须接着一个catch或者finally

上面情况,第一个块里没有catch,所以它跳找到最近的catch,在跳出之前他会先执行里面的finally

上面这种情况里面有catch,跑出异常之后会首先执行里面的catch,然后执行finally,因为一场在里面已经处理过了,所以不会再跑到外面在进行处理

上后面这种,顺序见右边,内部先try抛出异常,然后catch处理,finally,然后因为catch又抛出了这个异常,所以外面在处理,也就是如果里面的异常没有处理抛出了,它会在外面处理,但是要先执行里面的finally

function语句

function语句用来定义函数对象,用function定义的函数我们叫做函数声明,与之对应的另一种我们叫做函数表达式,如下

他们的最主要的区别就是函数声明会被预先处理,或者叫函数前置

还可以通过new function 构造器的方式来创建函数对象

for …in语句

这里我们可以用for  in去遍历obj中的属性

switch语句

如下三种方法

循环语句

with语句

可以修改当前的作用域

如下,在js中已经不建议使用with了,因为在with中作用域会比较复杂

严格模式

严格模式是一种特殊的执行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性

可以向上兼容,如果老的浏览器不兼容,会被当做一个字符串忽略

需要注意的是并不一定是第一行的代码,再他前面可以用引号引起来abc这样,但不能用var 在前面

严格模式下的主要不同:

在严格模式下使用with或报错,SyntaxError语法错误

没有声明的变量被赋值会被报错

严格模式是一种特殊的运行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性

严格模式是向上兼容的

四、对象

对象中包涵一系列属性,这些属性是无序的,每个属性都有一个字符串key和对应的value。

对象的字符串key

对象的构造

每个对象除了标签和方法之外还有原型

比如我们创建一个函数 foo

每一个函数都会有一个prototype这样一个对象属性

如果我们吧foo.prototype.z 设置为3

再去new一个foo指向一个对象obj,它的原型就会指向他的构造器的prototype属性,也就是foo.prototype,我们之前设置了foo.prototype.z 是3

如果我们访问obj的x属性,会返回1,如果访问obj的z属性,没有,就会查找obj的原型,如果还没就会继续向上找直到原型链的最末端

对象中还有一个class标签来标示他是属于哪一个种类的

extensible标签来标示是否允许继续增加新属性

创建对象,原型链

要想搞对象,先得有对象字面量创建对象

我们可以用花括号括起来设置属性,对象字面量可以做对象的嵌套,比如某些对象的值又是对象

new 原型链

如果我们用function创建一个对象 foo,他会带一个prototype属性,这是一个对象属性,给他设置一个z的值等于3

用new赋构造器的方式造了一个新的变量obj,给obj赋值添加两个属性

通过new构造对象

它的主要特点是它的原型会指向她的构造器的prototype属性,也就是foo.prototype

这样的作用是,当我们访问obj.x和obj.y都会返回他得值,当他访问obj.z他回去查找它的原型也就是foo.prototype,返回z值3

foo也是有原型的,它会指向object.prototype,object.prototype又会指向它的原型null

最后一句返回false表示z并不是他本身的,而是它的原型链上的

需要注意,当我们给对象赋值的时候,不会像原型链上去查找

如果他本身有这个属性,他会修改,如果没有,他会增加这个属性

这时候我们在看,obj.z是5,foo.prototype.z是3

如果我们给obj.z赋值undefined,在查找就会返回undefined

所以返回undefined并不一定是没有,可能他得值就是undef

如果想在拿到原型链上的z,需要先delete obj.z

delete obj.z不删除原型链

Object.create创建对象

这是一个系统内置的函数,他会接受一个参数,一般是一个对象,它会返回一个新创建的对象,并让这个对象的原型指向这个参数

并不是所有的对象都有toString,并不一定所有对象的原型链上都有Object.prototype

属性操作

读写对象属性

我们可以过 . 操作符去访问他的对象属性,也可以用 【】 把他的key传进去,这里我们需要的是一个字符串,我们也可以写其他的,但是也会被转成字符串

一般建议用obj.的方式

但是如右边,有 x1 x2 ... 这里我们可能需要去循环动态的处理,我们需要区拼这个属性名的时候,往往要用 【】

除了用for去拼写外,我们也会用for in去遍历所有的属性,但是也可会吧原型链上的属性也遍历出来,并且顺序是不确定的

当我们尝试去读写不存在的属性

比如我们创建一个对象obj,访问一个不存在的属性y,原型链查找,找到原型链的末端null还是找不到就会返回 underfined

如果写这个属性的话,如果有就修改对象的值,如果没有就创建并赋值

obj.y是undefined,再去访问obj.y.z就会报错不能获取underfined的属性z,返过来去赋值

巧用运算符实现链式读取

定义变量yz,想去对obj.y去操作的时候,obj不为空,但是想要检测y属性是否有的时候,有时会用if,把y.z取出来做一些处理

巧用运算符,&&,如果有的话就继续向右去找,如果有一个是underfined就会返回,一直找到最后,如果obj.y.z存在就会返回z的值

删除属性

用delete删除返回true表示删除成功

也可以用  [ ] 传进去也可以实现属性的删除

如果重复删除,会不会有问题,由于属性已经不存在,JavaScript仍会返回true,所以delete返回true只说明没有了这个属性,并不说明删除成功

有些属性如 prototype 是不允许被删除的,会返回false

我们可以尝试传入,要查看的对象Object,要查看的属性prototype

下面的意思是否可配置  ,不

如果用var定义的变量或者局部变量仍然不可以被删除

函数声明也是同理,或者函数内部的局部作用域的函数,都不可以被删除

如果饮食的创建全局变量,没有定义ohNo,我们可以用window. 来拿到 1,delete成功删除

检测

用new Object构造一个变量cat,通过赋值添加两个属性,

用in检测,in会查找到原型链,所以cat的属性legs和原型链上的toString都会返回true,但是abc这样一个不存在的会返回false

用hasOwnPrototy

最后是用prorerIsEnumerable是否可枚举

怎样自定义一个属性让他的枚举是false、

我们想把cat的legs数量乘以二,先用if 查看cat和cat。legs转化的布尔值都不是false时,称等于2

或者 !=underfined 时,一个等于null和underfined是想等的,也就是不等于null在做以下处理

如果只不等于underfined,要用!==

枚举属性

定义变量o,有x y z三个属性

toString在o或者o的原型链上

不可枚举

定义变量key用in不会出来

如果我们用create创建一个变量obj,原型指向o,给obj添加属性a,值是4,可枚举

遍历不管是a,还是xyz都会在遍历中显示出来

有时只想处理变量上的属性不想处理原型链上的属性

只需要加一个has判断过滤掉原型链上的属性就可以

属性的getter,setter方法

可以看到这两个方法和其他方法区别很大

属性标签

查看变量的属性标签

管理或者说设置属性

对象标签

主要有三种

proto   class    extensible

proto实际上就是原型

class表示对象是哪个类型

没法获取,可以间接地

extensible表示是否可拓展

序列化 其他对象方法

序列化自定义

toString和valueOf也是常见的对象方法

JavaScript深入浅出补充——(二)语句和严格模式,对象的更多相关文章

  1. JavaScript深入浅出补充——(一)数据类型,表达式和运算符

    项目基本做完,在进行下一阶段学习之前先看视频学习回顾一下JavaScript 一.数据类型 JavaScript中有五种原始类型和一种对象类型 JavaScript弱类型语言中隐式转换 num-0 字 ...

  2. this的用法 – JavaScript深入浅出(二)

    写在前面 上一篇中,我们对于JavaScript中原始值.复杂值以及内存空间进行了一个深入浅出的总结,这次我们来聊一聊JavaScript中this关键字的深入浅出的用法. 在 JavaScript ...

  3. 常用的JavaScript设计模式(二)Factory(工厂)模式

    Factory通过提供一个通用的接口来创建对象,同时,我们还可以指定我们想要创建的对象实例的类型. 假设现在有一个汽车工厂VehicleFactory,支持创建Car和Truck类型的对象实例,现在需 ...

  4. JavaScript学习(二)——深入学习js对象的原型与继承

    了解对象  什么是对象?   …… 这个就不说了 对象的声明的两种方式 var person = new Object(); person.name="linchen"; pers ...

  5. javascript基础(二): 操作BOM对象(重点)

    浏览器介绍 javascript和浏览器关系?BOM:浏览器对象模型 IE6~11 Chrome Safari FireFox Opera 三方 QQ浏览器 360浏览器 window window代 ...

  6. JavaScript深入浅出3-语句

    慕课网教程视频地址:Javascript深入浅出 程序由语句组成,语句遵守特定语法规则 块 block  {}   没有块级作用域 声明    var 异常   try catch finally 函 ...

  7. 函数原型属性-JavaScript深入浅出(三)

    前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...

  8. 原型那些事 - JavaScript深入浅出(三)

    前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了this深入浅出 ...

  9. javascript 语句和严格模式(三)

    一.语句 javascript程序由语句组成,语句遵守特定的语法规则. block break continue empty if...else switch try catch var functi ...

随机推荐

  1. NodeJS安装第一个工程

    一.刚接触Node.js,下载好安装包后,一路Next,安装好后,结构目录如下 在命令行窗口输入node -v 和npm -v 二.建立一个Node.js工程 1.(控制台窗口)全局安装了expres ...

  2. 3、J2EE学习推荐书籍

    3.J2EE学习推荐书籍       J2EE的学习应该循序渐进,一本好书会很快上手和深入.在学习J2EE之前,应该学好SQL,基本上,程序设计都会跟数据库打交道.如果SQL没学好,就如同房子没有基脚 ...

  3. Struts2 Handle 404 error page and wrong action

    1. To handle 404 not found yourself, just add this code to your web.xml <error-page> <error ...

  4. CF219C hoosing Capital for Treeland

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  5. 汽车Vin码识别——可以嵌入到手机里的新OCR识别技术

              汽车Vin码识别(车架号识别),顾名思义,就是识别汽车的Vin码(车架号),汽车Vin码识别(车架号识别)利用的是OCR识别技术,支持视频流获取图像,自动触发识别,另外汽车Vin码 ...

  6. 网络安全——一图看懂HTTPS建立过程

    关于网络安全加密的介绍可以看之前文章: 1. 网络安全--数据的加密与签名,RSA介绍 2. Base64编码.MD5.SHA1-SHA512.HMAC(SHA1-SHA512) 3. When I ...

  7. 一天搞定CSS(扩展):CSS Hack

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来达到大家要求的页面表现.我个人是不太推荐使用hack的,要知道 ...

  8. 一天搞定HTML----标签类型与类型转换05

    标签类型: 标签只有两类:行内元素和块元素 行内元素:内容撑开宽高 块元素:默认独占一行 注意: 在使用display时,会遇到一种inline-block类型的标签.这种标签不属于标签的分类. 1. ...

  9. HTML里的哪一部分Javascript 会在页面加载的时候被执行?

    最近遇到一个问题:HTML里的哪一部分Javascript 会在页面加载的时候被执行()A : 文件头部 B : 文件尾 C : <head>标签部分 D : <body>标签 ...

  10. RELabel : 一个极简的正则表达式匹配和展示框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...