JavaScript 学习笔记01 (变量声明、数据类型)

JavaScript 笔记01

虽然上周日就准备开始看 JavaScript ,但是今天公司产品上线,这周一直挺忙的,从今天才刚开始看,因为 JavaScript 高级程序设计这本书之前看过,所以这次准备过一遍,遇到一些难点或者需要注意的就记录下来,不会每条都记,这个过程可能历时会有点久,毕竟我还是觉得 js 是前端的基础,js 这块学好了,前端很懂东西都能比较容易上手。在一个前端朋友的推荐下,准备配合廖雪峰老师的JavaScript 教程一起看。看完之后再找个 ES6 的教程。之后就可以看 vue 了,其实这周自己想先看 vue 的,因为工作中遇到了一些难点,看了一会还是觉得不能急于求成,得把 js 的基础打好。今天用了 Typora,真的太好用了。以后就决定先用 Typora 写,本地写完再 copy 到 github 和简书上。这个是相关教程。


1.变量提升

参考这篇,变量声明就是变量和函数声明会被移到当前作用域作用域是肯定要重点看的,高级设计这本书里我记得讲的比较详细,我就不找那种整理的文章了,等看到了再一步步把他弄透的最顶部,然后只在编译时执行变量和函数声明,并不会执行赋值,其实上面那个链接里看几个例子就懂了,然后 let 和 const 不存在变量提升现象。

举个例子:

a = 9;
var a;
console.log(a);
复制代码

这段代码会在编译时先执行 var a,然后在运行时执行赋值 a=9,所以结果是会打印出 9。还有个细节就是函数会由于变量,后出现的函数声明会覆盖之前的。


2.var let 区别

参考这篇:

  1. var 存在变量提升,let 和 const 不存在变量提升,其实第一点就是看这个之后详细去看的。

  2. **let声明的全局变量不是全局对象的属性。**这就意味着,你不可 以通过window.变量名的方式访问这些变量。

  3. 用let重定义变量会抛出一个语法错误(SyntaxError)。

  4. 总之,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
  • 复杂数据类型(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 的时候

  1. constructor: 构造函数

  2. hasOwnProperty(propertyName): 检测给定的属性在当前对象实例中是否存在。eg:o.hasOwnProperty("name")

  3. isPrototypeOf(Object): 用于检测传入的对象是否是当前对象的原型也是比较重要的东西,后面详细整理

  4. propertyIsEnumerable(propertyName): 用于检测给定的属性能否使用for-in语句来枚举

  5. 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

  6. toString(): 返回对象的字符串表示

  7. valueOf(): 返回对象的字符串、数值或布尔值表示

今天先写这么多了,白天贪玩了会,今天内容比较少,明天继续,再次夸一下 Typora ,真的太好用了,不过自己也在慢慢学习 markdown 的语法和别的博客的排版,毕竟看的舒服也很重要,现在赶紧复制去 github 上看看是不是效果和本地一样。

果然出问题了,注释功能到 github 上就挂了,很喜欢这功能啊,难受啊飞,忍痛换成别的吧

突然想起来还欠了篇 flex 布局的,明天写

你可能感兴趣的:(javascript,前端,markdown)