NaN、一元操作符、散列函数、undefined、null、Object.assign()、H5的Input新类型、Node.js的process模块

1、NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。

提示:请使用 isNaN() 来判断一个值是否是数字。原因是 NaN 与所有值都不相等,包括它自己。

2、一元操作符

(1)前置递增和递减操作符:变量的值在语句被求值以前改变;

var age = 29;

++age;  //30

var num1 = 2;

var num2 = 20;

var num3 = --num1 + num2;   //21

var num4 = num1 + num2;    //21    此时的num1用的是减去1后的值

(2)后置递减和递增操作符:

var age = 29;

age++;   //29

var num1 = 2;

var num2 = 20;

var num3 = num1-- + num2;   //22   此时的num1值不变

var num4 = num1 + num2;    //21    语句被执行后,此时的num1才是减去1后的值

3、js中默认将0开头的数默认为八进制

如:add(080) = add(56)  八进制转换为十进制

4、散列函数:一个把查找表中的关键字映射成该关键字对应的地址函数,记为Hash(key)=Addr。这里的地址可以是数组下标,索引,或内存地址等。散列函数可能将两个或两个以上的不同关键字映射到同一个地址,称这种情况为“冲突”。(假若这个函数是f(x)=x^2,-无穷<x<+无穷,则当x=+-1时,函数值相同,这种情况就成为冲突)这种冲突最好减少,但是这种冲突是避免不了的,所以要设计好解决冲突的方法。

散列表:根据关键字而直接进行访问的数据结构,散列表建立了关键字和存储地址之间的直接映射关系。理想情况下,散列表的查找时间复杂度为O(1),及与表中的元素个数无关。

常用的散列函数:

(1)直接定址法:直接取关键字的某个线性函数值为散列地址,散列函数为:H(key)=a*key+b其中a,b是常数。若其中H(key)中已经有值了,就往下一个找,直到H(key)中没有值了,就放进去。这种方式最简单,并且不会冲突,适用于关键字的分布基本连续的情况,若关键字分布不连续,空位比较多,将造成空间浪费。

(2)除留余数法:假定散列表表长为m,取一个不大于m但最接近或等于m的质数p,利用以下公式把关键字转换成散列地址,散列函数为H(key)=key%p。[注]关键是选好p,使得每一个关键字通过该函数转换后等概率地映射到散列空间上的任意地址,从而尽可能减少冲突的可能性。

(3)数字分析法:数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。

(4)平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。

(5)随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。

(6)折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。数位叠加可以有移位叠加和间界叠加两种方法。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。

5、undefined

null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。

null

在 JavaScript 中 null 表示 "什么都没有"。

null是一个只有一个值的特殊类型。表示一个空对象引用。

typeof "John"                // 返回 string 
typeof 3.14                  // 返回 number
typeof false                 // 返回 boolean
typeof [1,2,3,4]             // 返回 object
typeof {name:'John', age:34} // 返回 object

变量声明提升

1、变量定义

可以使用var定义变量,变量如果没有赋值,那变量的初始值为undefined

2、变量作用域

变量作用域指变量起作用的范围。变量分为全局变量和局部变量。全局变量在全局都拥有定义;而局部变量只能在函数内有效。 
在函数体内,同名的局部变量或者参数的优先级会高于全局变量。也就是说,如果函数内存在和全局变量同名的局部变量或者参数,那么全局变量将会被局部变量覆盖。 
所有不使用var定义的变量都视为全局变量

3、函数作用域和声明提前

JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。如下面例子: 
注释:声明提前是在JavaScript引擎的预编译时进行,是在代码开始运行之前。

var scope = 'global';
function f(){
    console.log(scope);
    var scope = 'local';
    console.log(scope);
}

由于函数内声明提升,所以上面的代码实际上是这样的

var scope = 'global';
function f(){
    var scope;    //变量声明提升到函数顶部
    console.log(scope);
    scope = 'local';    //变量初始化依然保留在原来的位置
    console.log(scope);
}

经过这样变形之后,答案就就非常明显了。由于scope在第一个console.log(scope)语句之前就已经定义了,但是并没有赋值,因此此时scope的指是undefined.第二个console.log(scope)语句之前,scope已经完成赋值为’local’,所以输出的结果是local

6、最终的结果取决于this运行时的环境

this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。

第一次console.log是This是指向的是调用它的对象baidu;第二次console.log是是在全局函数中,this等于window。

var baidu = {
    count: 2,
    getBaiduCount: function() {
        return this.count;
    }
};
console.log(baidu.getBaiduCount());
var func = baidu.getBaiduCount;
console.log(func());

 // 2 undefined

7、Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

const object1 = {
  a: 1,
  b: 2,
  c: 3
};

const object2 = Object.assign({c: 4, d: 5}, object1);

console.log(object2.c, object2.d);
// expected output: 3 5
Object.assign(target, ...sources)

Object.assign方法只会拷贝源对象自身的并且可枚举的属性到目标对象。

复制一个对象

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

合并对象

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。

合并具有相同属性的对象

var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

 8、arguments表示的就是传进来的参数,在函数里面为arguments赋值的情况下外面传进来的参数起不到任何作用,无论如何结果都为5。

var func = function(m, n) {
    arguments[0] = 3;
    arguments[1] = 2;
    return m + n;
}
console.log(func(1, 1));

9、正则

var str = ' a b c ';str.replace(/^\s+|\s+$/, '');
"a b c "
var str = ' a b c ';str.replace(/^\s+|\s+$/g, '');

"a b c"

\s: space, 空格
+: 一个或多个
^: 开始,^\s,以空格开始
$: 结束,\s$,以空格结束
|:或者
/g:global, 全局
replace() 替换
整体为如果是以一个或多个空格开始,替换全部空格为空,或者,如果是以一个或多个空格结束,替换全部空格为空。
var cookie = "  this is a cookie value     ";
cookie = cookie.replace(/^\s+|\s+$/g, '');
结果为 cookie 变成 "this is a cookie value"。前后空格全部去掉了。

而不加全局变量,那么只要匹配到就会进行替换之后停止。

10、HTML5 Input 类型

  • email(email 类型用于应该包含 e-mail 地址的输入域。在提交表单时,会自动验证 email 域的值。)
  • url (url 类型用于应该包含 URL 地址的输入域。在提交表单时,会自动验证 url 域的值。)
  • number
  • range (range 类型用于应该包含一定范围内数字值的输入域。range 类型显示为滑动条。)
  • Date pickers (date, month, week, time, datetime, datetime-local)
  • search
  • color

11、使用@font-face调用服务器端字体的代码 

 12、Node.js的process模块

process模块用来与当前进程互动,可以通过全局变量process访问,不必使用require命令加载。它是一个EventEmitter对象的实例。

属性

process对象提供一系列属性,用于返回系统信息。

  • process.pid:当前进程的进程号。
  • process.version:Node的版本,比如v0.10.18。
  • process.platform:当前系统平台,比如Linux。
  • process.title:默认值为“node”,可以自定义该值。
  • process.argv:当前进程的命令行参数数组。
  • process.env:指向当前shell的环境变量,比如process.env.HOME。
  • process.execPath:运行当前进程的可执行文件的绝对路径。
  • process.stdout:指向标准输出。
  • process.stdin:指向标准输入。
  • process.stderr:指向标准错误。

 13、浏览器的全局是window,而node.js的全局是global

猜你喜欢

转载自blog.csdn.net/Judy_qiudie/article/details/82716034