JavaScript基础知识篇-01

一、数据类型

数据类型:

  • 数值(number):整数和小数(比如13.14
  • 字符串(string):文本(比如Hello World)。
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空。
  • 对象(object):各种值组成的集合。

数值、字符串、布尔值这三种类型,合称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了

var a;
a // undefined

x
// ReferenceError: x is not defined

var a = null;
a
// null

1.数值

1.数值范围

JavaScript 能够表示的数值范围为21024到2-1023(开区间)

正向溢出:即 JavaScript 无法表示这么大的数,这时就会返回Infinity

负向溢出:即 JavaScript 无法表示这么小的数,这时会直接返回0

2.特殊数值

NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合

3.全局方法

parseInt() 将任何参数转化为字符串,然后再转化为整数

parseFloat() 将一个字符串转为浮点数

isNaN() 来判断一个值是否为NaN

isFinite() 某个值是否为正常的数值

2.字符串

字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)

var s = 'hello';
s[0] // "h"
s[1] // "e"
s[4] // "o"

Base64 转码

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

3.对象

什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合

对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器

object是最复杂的数据类型,又可以分成三个子类型。

  • 狭义的对象(object)

  • 数组(array)

  • 函数(function)

(1).狭义的对象

对象的引用

不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址,修改其中一个变量,会影响到其他所有变量,取消某一个变量对于原对象的引用,不会影响到另一个变量

var o1 = {};
var o2 = o1;

o1.a = 1;
o2.a // 1

o2.b = 2;
o1.b // 2
这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

表达式还是语句?

行首是大括号,一律解释为对象

eval('{foo: 123}') // 123      这是语句,表示代码区块
eval('({foo: 123})') // {foo: 123} 这是表达式,解释为对象

属性操作

var obj = {
  p: 'Hello World'
};
obj['p']      //读取对象的属性,obj.p效果一样。方括号运算符内部还可以使用表达式
obj['bar'] = 'World';  //点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值
Object.keys(obj);    //查看一个对象本身的所有属性
delete obj.p         //删除对象的属性
'p' in obj            //是否包含某个属性

var obj = {a: 1, b: 2, c: 3};     
for (var i in obj) {           //循环用来遍历一个对象的全部属性
  console.log('键名:', i);
  console.log('键值:', obj[i]);
}

with 语句

它的作用是操作同一个对象的多个属性

var obj = {
  p1: 1,
  p2: 2,
};
with (obj) {
  p1 = 4;
  p2 = 5;
}
with区块内部有变量的赋值操作,必须是当前对象已经存在的属性,否则会创造一个当前作用域的全局变量

(2).函数

(1)function 命令

function print(s) {
  console.log(s);
}

(2)函数表达式

var print = function(s) {
  console.log(s);
};

(3)Function 构造函数

var add = new Function(
  'x',
  'y',
  'return x + y'
);

函数的属性和方法

属性名/方法名 作用
name 返回函数的名字
length 返回函数定义之中的参数个数
toString() 返回一个字符串,内容是函数的源码

闭包

如果出于种种原因,需要得到函数内的局部变量。正常情况下,这是办不到的,只有通过变通方法才能实现。那就是在函数的内部,再定义一个函数,子对象会一级一级地向上寻找所有父对象的变量

链式作用域"结构(chain scope)

function f1() {
  var n = 999;
  function f2() {            //闭包就是函数
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 999
f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。

IIFE

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
不要让function出现在行首,让引擎将其理解成一个表达式,而不是函数定义语句

eval 命令

eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。val没有自己的作用域,都在当前作用域内执行

eval('var a = 1;');       //参数:字符串参数、数字
a // 1

var a = 1;
eval('a = 2');

a // 2        // 修改了全局变量

(3).数组

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。任何类型的数据,都可以放入数组

var arr = [
  {a: 1},
  [1, 2, 3],
  function() {return true;}
];

arr[0] // Object {a: 1}
arr[1] // [1, 2, 3]
arr[2] // function (){return true;}
属性/方法 作用
length 返回数组的成员数量,也可以修改length的值用于修改数组的长度
in 检查某个键名是否存在的运算符

for...in 循环和数组的遍历

var a = [1, 2, 3];

for (var key in a) {
  console.log(key);  
}

二、条件语句

1.if 结构

if (布尔值)
  语句;

2.if...else 结构

if (m === 0) {
  // ...
} else if (m === 1) {
  // ...
} else if (m === 2) {
  // ...
} else {
  // ...
}

3.switch 结构

var x = 1;

switch (x) {
  case 1:
    console.log('x 等于1');
    break;
  case 2:
    console.log('x 等于2');
    break;
  default:
    console.log('x 等于其他值');
}

4.三元运算符 ?

(条件) ? 表达式1 : 表达式2
var even = (n % 2 === 0) ? true : false;    //果n可以被2整除,则even等于true,否则等于false

三、循环语句

1.while 循环

var i = 0;

while (i < 100) {
  console.log('i 当前为:' + i);
  i = i + 1;
}

2.for 循环

var x = 3;
for (var i = 0; i < x; i++) {
  console.log(i);
}

3.do...while 循环

do {
  console.log(i);
  i++;
} while(i < x);
do...while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件

4.break 语句和 continue 语句

跳出代码块或循环
while(i < 100) {
  console.log('i 当前为:' + i);
  i++;
  if (i === 10) break;
}

continue语句用于立即终止本轮循环
var i = 0;

while (i < 100){
  i++;
  if (i % 2 === 0) continue;
  console.log('i 当前为:' + i);
}

5.标签

跳转到程序的任意位置

JavaScript 语言允许,语句的前面有标签(label),相当于定位符

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) break top;         //直接跳出双层循环
      console.log('i=' + i + ', j=' + j);
    }
  }
标签通常与break语句和continue语句配合使用,跳出特定的循环。

标签也可以用于跳出代码块

foo: {
  console.log(1);
  break foo;
  console.log('本行不会输出');
}

continue语句也可以与标签配合使用

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) continue top;
      console.log('i=' + i + ', j=' + j);
    }
  }
continue命令后面有一个标签名,满足条件时,会跳过当前循环
posted @ 2018-11-30 22:08  reaperhero  阅读(132)  评论(0编辑  收藏  举报