JavaScript 笔记01(变量提升、数据类型)
1.变量提升
参考这篇,变量声明就是变量和函数声明会被移到当前作用域作用域是肯定要重点看的,高级设计这本书里我记得讲的比较详细,我就不找那种整理的文章了,等看到了再一步步把他弄透
的最顶部,然后只在编译时执行变量和函数声明,并不会执行赋值,其实上面那个链接里看几个例子就懂了,然后 let 和 const 不存在变量提升现象。
举个例子:
a = 9;
var a;
console.log(a);
这段代码会在编译时先执行 var a
,然后在运行时执行赋值 a=9
,所以结果是会打印出 9
。还有个细节就是函数会由于变量,后出现的函数声明会覆盖之前的。
2.var let 区别
参考这篇:
-
var 存在变量提升,let 和 const 不存在变量提升,其实第一点就是看这个之后详细去看的。
-
let声明的全局变量不是全局对象的属性。这就意味着,你不可 以通过
window.变量名
的方式访问这些变量。 -
用let重定义变量会抛出一个语法错误(SyntaxError)。
-
总之,let 是更完美的 var,以后尽量只用 let,不用 var。
顺便说下 const 吧,const 其实相当于 Java 中的用final 定义常量,但 js 中的 const 必须定义的同时赋值,否则会报错。
3.声明一个全局变量(不推荐使用,仅了解)
虽然上面说了尽量用 let,但现在看的这本书里用的还是 var,所以我记录的还是 var,自己心里清楚就行了。
var 的作用域是函数内,let 是代码块内,但我们可以通过省略 var 操作符来声明一个全局变量。
function test(){
message = "hi"; // 全局变量
}
test();
alert(message); // "hi"
4.数据类型
- 简单/基本数据类型(5种)
- Undefined,只有一个值
undefined
- Null,只有一个值
null
- Boolean
- Number
- String
- Undefined,只有一个值
- 复杂数据类型(1种)
- Object
检测数据类型的方法:typeof
let message = "some string";
alert(typeof message); // string
alert(typeof(message)); // string
alert(typeof "message");// string
alert(typeof 95); // number
true/false
数据类型 | true | false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值 | 0和 NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
NaN
Not a Number
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false
alert(isNaN("10")); //false 被转换成数值10
alert(isNaN("blue")); //true 不能被转换成数值
alert(isNaN(true)); //true 被转换成数值1
Object 实例都具有的方法和属性
这部分记下来主要是为了方便以后调试或者找 bug 的时候
-
constructor
: 构造函数 -
hasOwnProperty(propertyName)
: 检测给定的属性在当前对象实例中是否存在。eg:o.hasOwnProperty("name")
-
isPrototypeOf(Object)
: 用于检测传入的对象是否是当前对象的原型也是比较重要的东西,后面详细整理
-
propertyIsEnumerable(propertyName)
: 用于检测给定的属性能否使用for-in
语句来枚举 -
toLocaleString()
: 返回对象是字符串表示,该字符串与执行环境的地区对应new Date().toLocaleString() // "2018/5/5 下午12:48:03" 像样的时间 [999,99,9,888,88,8,'a', 'z'].toLocaleString() // "999,99,9,888,88,8,a,z" 就是Arr.join(',') 2039475923.123.toLocaleString() // "2,039,475,923.123" Num加个千分位
toLocaleString设计初衷应该是给开发者提供‘同一逻辑,世界各地都能看懂’的方法,调用时如果不传参,会默认宿主环境语言来返回结果,也可以用html标签的lang指定语言,这样执行时就默认用的lang
-
toString()
: 返回对象的字符串表示 -
valueOf()
: 返回对象的字符串、数值或布尔值表示