markdown JavaScript基础语法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown JavaScript基础语法相关的知识,希望对你有一定的参考价值。

## 变量
>存储具体值(常量)的容器和代名词, 指向的内容可变

### 创建方式
- var (ES3)
- function (ES3) 创建函数(函数名也是变量, 存储函数类型的值)
- let (ES6)
- const (ES6) 创建常量
- import (ES6) 基于ES6的模块规范导出需要的信息
- class (ES6) 创建类

```JavaScript
/*
 *语法:
 *  var [变量名] = 值;
 *  let [变量名] = 值;
 * const [变量名] = 值;
 * function 函数名(){
 * 
 * }
 */
```

命名规范: 
- 严格区分大小写
- 遵循驼峰命名法: 字母/下划线/数字(不能作为变量名的开头)/$ 命名基于英文单词拼接成完整的名字(第一个单词字母小写, 其余每一个有意义的单词的首字母都大写)
```var studentInfo / student_info / _studentInfo(下划线开头的都是公共变量) / $studentInfo($符开头一般存储的是jQuery元素) ```
语义化: add / del / update, info / detail
- 关键字(存在特殊含义) 保留字(未来可能会成为关键字)

## 数据类型

- 基本数据类型(值类型)
  + 数字 number => -3, -1.5, 0, 2, 4.8 NaN(not a number 代表不是一个有效数字, 但是属于number类型) 
  + 字符串 string => 'a', "b", 'abc', "abc"
  + 布尔 boolean => true(真), false(假)
  + null
  + undefined
- 引用数据类型
  + 对象 object
    + 普通对象 var o = {name: 'Tom', age: 9}; 大括号包裹, 逗号分隔, 键值对(属性名和属性值); {} 为空对象
    + 数组对象 var arr = [1, 2, 3]; 中括号包裹, 逗号分隔, 数组元素; [] 为空数组
    + 正则对象 var reg = /-?(\d|([1-9]\d+))(\.\d+)?/g; 由元字符组成
    + 日期对象 var date = new Date();
    + ...
  + 函数 function var fn = function () {}
- ES6新增: Symbol, 创建唯一的值

### 引用数据类型的创建过程
1. 开辟新的堆内存空间
2. 把`值`存储到堆内存空间中
    - 函数: 函数代码当做"字符串"作为存储的`值`
    - 对象: 键值对作为存储的`值`
3. 把开辟的堆内存地址赋值给栈内存中的函数名(变量名)

### 函数执行过程
1. 首先会形成一个私有的作用域(一个供代码执行的环境, 也是一个栈内存)
2. 其次会将之前存储在堆内存中的代码字符串复制一份过来, 变为真正的JS代码, 在新开辟的作用域中自上而下执行

```
var a = Symbol('FLAG');
var b = Symbol('FLAG');
a == b //false
```

## 运行环境
- 浏览器(浏览器内核渲染解析)
- Node(基于V8引擎渲染解析)

## 输出
- alert() alert(1+1); 结果为字符串 '2', 通过toString()方法转化为字符串后再输出; window.alert()
  + alert(true); 'true'
  + alert([1, 2]); '1,2'
  + alert({name: 'Tom'}); '[object object]'
- confirm(): 和alert用法一致, 区别是除了确定还有取消按钮 var flag = window.confirm()  //flag = true or false
- prompt(): 在confirm的基础上增加输入框 //不常用
- console.log(): 在浏览器控制台输出日志
- console.dir(): 比log输出更加详细(尤其在输出对象时)
- console.table(): 把json数据按照表格方式输出

## 数据类型详细剖析

### number 数字类型

NaN(not a number)是number类型的

isNaN : 检查当前值是否不是有效数字, true-不是有效数字, false-是有效数字
```
isNaN(123) false
isNaN('123') false
isNaN(true) false
isNaN(null) false
isNaN(undefined) true
isNaN({}) true
isNaN([]) false
isNaN([1]) false
isNaN([1, 2]) true

//运行机制
if(当前值为有效数字){
  return false;
}
else {
  转化后的值 = 浏览器尝试将值转换为数字类型
  [基本数据类型]
  Number('123') = 123
  Number('1.23') = 1.23
  Number(true) = 1
  Number(false) = 0
  Number(null) = 0
  Number(undefined) = NaN
  
  [引用数据类型]
  Number(({}).toString()) → "[object Object]" → NaN
  Number([].toString()) → "" → 0
  Number([1].toString()) → "1" → 1
  Number([1, 2].toString()) → "1, 2" → NaN
  
  if(转化后的值为有效数字){
    return false;
  }
  else {
    return true;
  }
}

//数字类型中只有NaN不是有效数字, 其余都是有效数字
```

### parseInt / parseFloat

与Number的区别在于:
>Number: 出现任意非有效数字字符, 结果就是NaN Number("12.3px") = NaN

>parseInt: 解析出字符串中的数字(整数) parseInt("12.3px") = 12

>parseFloat: 解析出字符串中的数字(整数和小数) parseFloat("12.3px") = 12.3  但是 parseFloat("width: 12.3px") = NaN

>parseInt 或 parseFloat 在查找有效数字字符时, 一旦遇到非有效数字字符, 结束查找

### NaN的比较

```
NaN == NaN : false NaN和包括自己的任意数值都不相等 Number('a') = NaN != NaN = Number('b')

if(Number(value) == NaN) 错
if(isNaN(Number(value))) 正
```

### 布尔类型

如何把其他类型的数据转换为布尔类型?

- Boolean
- !
- !!

```
Boolean(0) false
Boolean(NaN) false
Boolean('') false
Boolean(null) false
Boolean(undefined) false
//以上五个以外的值转换成布尔类型都是true

Boolean(1) true
Boolean(-1) true
Boolean('1') true
Boolean({}) true
Boolean([]) true
//显式转换
```

```
!0 true
!NaN true
!'' true
!null true
!undefined true

!1 false
!-1 false
!1 false
!{} false
![] false
//隐式转换
```

```
!!0 false
!!NaN false
!!'' false
!!null false
!!undefined false

!!1 true
!!-1 true
!!1 true
!!{} true
!![] true
```

### null & undefined

>null: 空对象指针

>undefined: 未定义

>区别
> - null 人为暂时赋值为空, 后面会再修改 var num = null
> - undefined 浏览器分配 var num //undefined

### object 对象数据类型

>普通对象
> - 由大括号包裹
> - 由零到多组属性名和属性值(键[key]值[value]对)组成

属性: 描述对象具备的特征, 属性值是对这个特征的描述

属性值可以为任意类型的值, 属性名可以为字符串或数字
```JavaScript
var obj = {
  0: 'Tom',
  1: 'Jerry'
}

var arr = ['Tom', 'Jerry']
arr
0: 'Tom'
1: 'Jerry'
length: 2

arr[1] // 'Jerry'
arr['1'] // 'Jerry'
arr.1 // Uncaught SyntaxError: Unexpected number
arr.'1' // Uncaught SyntaxError: Unexpected string
arr.length // 2
arr['length'] // 2

对于数组对象, 索引or属性名?

//数组对象支持非数字索引

arr['age'] = 24 // 正
0: 1
1: 2
age: 24
length: 2

arr = [12, 34, age: 24] // Uncaught SyntaxError: Unexpected token :
```

obj[xxx], xxx可以为任意类型的具体值
```
obj['key']
obj[1]
obj[true] //true.toString()
obj[undefined] //undefined.toString()
obj[{}] //{}.toString()
obj[[]] //[].toString()
```

```JavaScript
var obj = {
  name: 'Tom',
  age: 9
}

[查]
obj.name //'Tom'
obj["name"] //'Tom'
obj[name] //Uncaught ReferenceError: name is not defined
//name 是变量, 其存储的值才是属性名

var name = "name"
obj[name] //'Tom'
var name = "nam"
obj[name] //undefined

[增 / 改]
obj.sex = '男'
obj.name = 'Lucy'

[删]
彻底删除: 将属性从对象中移除
delete obj["age"]
obj.age //undefined

假删除: 将属性值赋值为空
obj.age = null
```

var a = 1 和 var b = {key: 'value'} 的执行过程
1. 开辟内存空间(栈内存或堆内存)
2. 将值存储到开辟的内存空间中
3. 声明变量
4. 将变量名与内存空间之间建立联系

```
var obj = {
  m: 10,
  n: obj.m * 10
};
console.log(obj.n) //Uncaught TypeError: Cannot read property 'm' of undefined
```

>在执行到第2步时报错, 堆内存空间的地址还没有赋值给obj, 此时的obj是`undefined`

```
var arr1 = [3,4]
var arr2 = arr1
arr2[0] = 1
arr2 = [4,5]
arr2[1] = 2
arr1[1] = 0

//arr1 : [1, 0]
//arr2 : [4, 2]
```

数值的`真假`
- 0/NaN/''/null/undefined 为 `false`
- 其余的值为 `true`

检测数据类型的四种方式:
- typeof
- instanceof
- constructor
- Object.prototype.toString.call()

### typeof
- 返回值可以是: "number"/"string"/"boolean"/"undefined"/"object"/"function"
- typeof null //"object" null代表空对象指针(不指向任何的内存空间)
- typeof 数组/正则/对象 的返回值都是"object", 无法细分对象
- typeof 不是方法, 而是操作符`operator `
- 括号是可选的

```JavaScript
var num = parseInt('width:35.5px');
if(num==35.5){
  alert(0);
}else if(num == 35){
  alert(1);
}else if(num == NaN){
  alert(2);
}else if(typeof num=='number'){
  alert(3);//alert输出字符串
}else{
  alert(4);
}

//'3'
```

### void
void是javascript中的一个函数,接受一个参数,返回值永远是undefined

void 0 is a correct and standard way to produce undefined
```
void 0
void (0)
void "hello"
void (new Date())
//all will return undefined

<a href="javascript:void(0)">单此处什么也不会发生</a>
```

### 三元运算符
```
var a = 1;
var b = a == 1 ? (a++, a*=10) : null; //20
```

### switch case

```
var num = '10';
if (num == 10){
  num++;
} else if (num == 5){
  num--;
}else {
  num = 0;
}

console.log(num); //11

switch (num) {
  case 10: //这里相当于 === 绝对相等(类型和值), 真实项目中为了代码的严谨性, 多用绝对相等
    num++;
    break; //有时可以不加break以达到"或 ||"的效果
  case 5:
    num--;
    break;
  default:
    num = 0;
}

console.log(num); //0

num = num + 1; //'101' 这里是字符串拼接, 而非数学运算
num++ //11
```

>三元运算符: 简单条件

>switch case: 多分支

>if else: 多级嵌套

```
for ([initialization]; [condition]; [final-expression])
   statement
```
>```continue``` 会继续执行 ```final-expression``` 而 ```break```不会

以上是关于markdown JavaScript基础语法的主要内容,如果未能解决你的问题,请参考以下文章

javascript 仅在markdown语法中解析斜体

Markdown基础语法(上)

MarkDown基础语法大全

MarkDown基础语法

MarkDown基础语法

Markdown之基础语法