javascript高级程序设计第四版读书笔记-第三章 语言基础

3.3 变量

1.如何开启严格模式?严格模式的规则?变量?对象?函数?参数?this?eval和argument?
=》在全局或函数内部中开头添加 “use strict”
=》变量:1、不能意外创建全局变量,message =xxx;2、无法在变量前使用delete variable
=》对象:1、只读属性赋值,2、在不可配置属性上使用 delete 3.给不存在的对象添加属性 4.属性名重名(es6可以)
=》函数:1.形参名不可重复,(非严格第一个参只能用argument访问)2.命名参和argument完全不影响 3.不能使用了 arguments.callee 和 arguments.caller(读写都不行)4.函数声明不允许声明在if(){函数}
=》函数的参数:1.使用了ES6的参数解构,剩余操作符,默认参数,函数内不允许使用严格模式,可以全局严格模式
=》this:1.必须指定this,null会报错,不然使用会报错,,非严格模式如果指定this为null,则是指向全局
=》eval和argument:严格模式不允许他们为变量,函数的属性,函数名
=》其他不允许使用with和八进制

2.var、let、const之间的区别?
(1).作用域:var作用域是函数级,即函数内都是效的,let、const只在{}有效

function fn1() {
            if (2 > 1) {
                var strt = "11";
                let j = 2;
            }
            for (let i = 1; i < 10; i++) {
                console.log(i, j); //j报错
            }
            console.log(strt, j);//渗透到外部
        }
        fn1();

(2).变量提升:var有, let和const没有
(3).可改变:var、let可以修改,const只要存储对象时可以修改对象属性的值
(4).可以重复声明:var可以重复声明,let、const不可重复声明
(5).let、const声明的全局变量,不会挂载到window对象上,var会

3.4 数据类型

3.数据类型有哪一些?typeof有哪一些结果?typeof null的结果?
6种基础类型 1.Number 2.String 3.Boolean 4.undefined 5.Null 6.Symbol引用数据类型 7.Object;
typeof 的结果 1."number" 2."string" 3.boolean 4."undefined" 5."function" 6."object" 7.symbol;
typeof null 为object

4.打印一个未声明和一个未初始化的变量的结果是?typeof 他们的值是?console.log(null == undefined) null === undefined结果为?

let name; console.log(name);//undefined  console.log(age)// 报错;

都是undefined ;
true 但他们并不真的相对,false ===会检查类型是否相同

5.浮点数的运算,精确吗?3个非数字转成数字的方法的使用?还有一元加操作
不精确;
(1)Number()函数基于如下规则执行转换。
 布尔值,true 转换为 1,false 转换为 0。
 数值,直接返回。
 null,返回 0。
 undefined,返回 NaN。
 字符串,应用以下规则
(2)parseInt()函数更专注于字符串是否包含数值模式。字符串最前面的空格会被
忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即 返回 NaN。这意味着空字符串也会返回 NaN(这一点跟 Number()不一样,它返回 0)。如果第一个字符 是数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。比如, "1234blue"会被转换为 1234,因为"blue"会被完全忽略。类似地,"22.5"会被转换为 22,因为小数点不是有效的整数字符
都是全局方法
如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换:布尔值 false 和 true 转换为 0 和 1,字符串根据特殊规则进行解析,对象会调用它们的 valueOf()和/或 toString() 方法以得到可以转换的值。

6.如何获取字符串长度,有啥问题?字符串可以改变吗?7种数据类型那些有toString()方法有啥用?
str.length 如果里面有汉字可能不准确;字符串不能被改变,只有null、undefined没有toString()方法,toString() 通常表示转换为字符串,

 let age = 11; 
let ageAsString = age.toString(); // 字符串"11" 
let found = true; 
let foundAsString = found.toString(); // 字符串"true" 

7.字符串插值符号和原始字符串?
xx${value}xx str=String.raw原始字符串,转义符不生效

8.Symbol的作用是什么?如何创建/读取普通符号,和全局符号?有什么作用?

符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。符号就是用来创建唯一记号,进而用作非 字符串形式的对象属性。

let genericSymbol = Symbol(); 
console.log(genericSymbol); // Symbol() 
let fooSymbol = Symbol('foo'); 
console.log(fooSymbol); // Symbol(foo); 
不能使用字面量new创建
let fooGlobalSymbol = Symbol.for('foo'); // 创建新符号 
let otherFooGlobalSymbol = Symbol.for('foo'); // 重用已有符号 
console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true 
全局符号
// 创建全局符号 
let s = Symbol.for('foo'); 
console.log(Symbol.keyFor(s)); // foo 
// 创建普通符号 
let s2 = Symbol('bar'); 
console.log(Symbol.keyFor(s2)); // undefined 
如果传给 Symbol.keyFor()的不是符号,则该方法抛出 TypeError: 
Symbol.keyFor(123); // TypeError: 123 is not a symbol 

=>使用
let s1 = Symbol('foo'), 
s2 = Symbol('bar'); 
let o = { 
[s1]: 'foo val',  // 计算属性
[s2]: 'bar val', 
baz: 'baz val', 
qux: 'qux val' 
}; 
console.log(o)
o[s1]  //注意不可以用.访问

9.获取对象实例的常规和Symbol属性键和获取他们属性描述的方法?获取两种全部属性键的方法?

let s1 = Symbol('foo'), 
s2 = Symbol('bar'); 
let o = { 
[s1]: 'foo val', 
[s2]: 'bar val', 
baz: 'baz val', 
qux: 'qux val' 
}; 
console.log(o)
o[s1]
console.log(Object.getOwnPropertySymbols(o)); 
// [Symbol(foo), Symbol(bar)] 
console.log(Object.getOwnPropertyNames(o)); 
// ["baz", "qux"] 
console.log(Object.getOwnPropertyDescriptors(o)); 
// {baz: {...}, qux: {...}, Symbol(foo): {...}, Symbol(bar): {...}} 
console.log(Reflect.ownKeys(o)); 
// ["baz", "qux", Symbol(foo), Symbol(bar)] 

10.常见内置符号:Symbol.hasInstance、Symbol.iterator由什么语句使用?
(1)这个符号作为一个属性表示“一个方法,该方法决定一个构造器对象是否认可一个对象是它的实例。由 instanceof 操作符使用”,是定义在Function的原型上的

class Bar {} 
let b = new Bar(); 
console.log(b instanceof Bar); // true ES6 中,instanceof 操作符会使用 Symbol.hasInstance 函数来确定关系。以 Symbol. 
hasInstance 为键的函数会执行同样的操作,只是操作数对调了一下: 
function Foo() {} 
let f = new Foo(); 
console.log(Foo[Symbol.hasInstance](f)); // true

(2)
这个符号作为一个属性表示“一个方法,该方法返回对象默认的迭代器。
由 for-of 语句使用”。
这个由 Symbol.iterator 函数生成的对象应该通过其 next()方法陆续返回值。可以通
过显式地调用 next()方法返回,也可以隐式地通过生成器函数返回:


```kotlin
class Emitter { 
constructor(max) { 
this.max = max; 
this.idx = 0; 
} 
*[Symbol.iterator]() { 
while(this.idx < this.max) { 
yield this.idx++; 
} 
} 
} 
function count() { 
let emitter = new Emitter(5); 
for (const x of emitter) { 
console.log(x); 
} 
} 
count(); 
// 0 

11.Object实例原型上的7个方法是什么?含义是什么?
 constructor:用于创建当前对象的函数。在前面的例子中,这个属性的值就是 Object()
函数。
 hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属
性。要检查的属性名必须是字符串(如 o.hasOwnProperty(“name”))或符号。
 isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
 propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用(本章稍后讨
论的)for-in 语句枚举。与 hasOwnProperty()一样,属性名必须是字符串。
 toLocaleString():返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。
 toString():返回对象的字符串表示。
 valueOf():返回对象对应的字符串、数值或布尔值表示。通常与 toString()的返回值相同。

12.Object是JavaScript种所有类对象的基类吗?
严格来讲,ECMA-262 中对象的行为不一定适合 JavaScript 中的其他对象。比如浏
览器环境中的 BOM 和 DOM 对象,都是由宿主环境定义和提供的宿主对象。而宿主对象
不受 ECMA-262 约束,所以它们可能会也可能不会继承 Object。

13.标签语句在循环种的应用?

let num = 0; 
outermost: 
for (let i = 0; i < 10; i++) { 
for (let j = 0; j < 10; j++) { 
if (i == 5 && j == 5) { 
break outermost; 
} 
num++; 
} 
} 
console.log(num); // 55

14.width语句的作用是什么?严格模式允许使用吗?
with 语句的用途是将代码作用域设置为特定的对象

with(location) { 
let qs = search.substring(1); 
let hostName = hostname; 
let url = href; 
}

严格模式不允许使用 with 语句,否则会抛出错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值