javascript相关基础

event

window.event...

键盘处理程序 onkeypress

字符代码会存放在event.which()//netscape或者event.keyCode()//IE

将ascii转换为字符串

String.fromCharCode(event.which);//event.keyCode;

全局、局部变量

  • 任何再函数体内的用var声明的变量都是局部变量,即使和全局变量重名,也是可以的,是不同的变量

  • 如果再函数体内不适用var,那么所声明的变量不是局部变量,如果这个时候函数体外有同名变量,就会错误的改变变量值,导致程序出错

     var a = 10;
     function add() {
         a = 20;
         console.log(a);
     }
     add(); //20
     console.log(a); //20

特性

动态性

var key = "property"
console.log(key)

var duixiang = {
    property: "my canshu"
}
console.log(duixiang.property)
console.log(duixiang["property"])
console.log(duixiang[key])

delete duixiang["property"]
console.log(duixiang[key]) 

//property
my canshu
my canshu
my canshu
undefined

弱类型

类型是和值相关的,而不是和变量相关的

定义变量无须显式声明,很大的灵活性

也有不利的一面,比如需要面向对象的时候

数据类型

原始类型:

ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、Number 和 String。

引用类型:对象

还有数组(跟对象差不多,因为都存的是首地址呀)

数组

不用new,直接"=[ ]"是一样的意思

string

.length只读属性

大小写转换

toUpperCase()

toLowerCase()

子字符串

.substring(a,b) a--(b-1)索引的字符 b可以没有

单个字符

.charAt(a)

查找字符串

.indexof("text"),返回开始的索引值

.indexof("text",2)可以指定从哪里开始查找(可以用于寻找重复的字符串)

.lastIndexOf("text") 从后向前搜索,即最后一个出现的目标,再返回索引值

.lastIndexOf("text",20) 制定位置参数,会从该位置向前搜索

分离字符串

.split(",") 返回字符串数组

合并字符串

.join(",") 返回字符串

字符串数组排序

.sort() 返回字符串数组!!!这里会改变原数组为有序哦!!!

.sort(numcompare) numcompare自定义函数,根据这个来排序

function numcom(a, b) {
  return a - b;
}
strs = ['3', '4', '435', '13', '1', '2']

console.log(strs.sort(numcom));

数字

处理金钱

toFixed(2) 非常适合处理金钱。
var x = 9.656;
x.toFixed(0);           // 返回 10
x.toFixed(2);           // 返回 9.66
x.toFixed(4);           // 返回 9.6560
x.toFixed(6);           // 返回 9.656000

进制

但是您能够使用 toString() 方法把数输出为十六进制、八进制或二进制。
实例

var myNumber = 128;
myNumber.toString(16);     // 返回 80
myNumber.toString(8);      // 返回 200
myNumber.toString(2);      // 返回 10000000

JavaScript 会把前缀为 0x 的数值常量解释为十六进制。

绝不要用前导零写数字(比如 07)。

一些 JavaScript 版本会把带有前导零的数解释为八进制。

精确范围

整数

整数(不使用指数或科学计数***被精确到 15 位。

小数

小数的最大数是 17 位,浮点的算数并不总是 100% 精准

使用乘除法有助于解决上面的问题:

实例

var x = (0.2 * 10 + 0.1 * 10) / 10;       // x 将是 0.3

===

第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。

==

数字啥的对象比较会更糟糕,是因为,两个都是对象无法比较

NaN

这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:

浮点数

注意的相等比较:

Infinity

Infinity (或 -Infinity)是 JavaScript 在计算数时超出最大可能数范围时返回的值。

除以 0(零)也会生成 Infinity:

typeof Infinity;        // 返回 "number"
##  \- undefined

 大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。 

 \- 强烈建议直接使用[]。

 var arr = [1, 2, 3.14, 'Hello', null, true];
 arr[0]; // 返回索引为0的元素,即1
 arr[5]; // 返回索引为5的元素,即true
 arr[6]; // 索引超出了范围,返回undefined

 \- 只能用var申明一次,例如:

 var a = 123; // a的值是整数123
 a = 'ABC'; // a变为字符串

##  \- strict模式

 启用strict模式的方法是在JavaScript代码的第一行写上:

 'use strict';

##  \- 字符

 如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:

# ES6标准 

 \1. ES6模板字符串

 console.log(\`你好, ${name}, 你今年${age}岁了!\`);

 \2. 多行字符串的表示方法


 反引号:\`这是一个多行字符串\`;


 访问不存在的属性不报错,而是返回undefined:

 xiaoming.age = 18; 

 // 新增一个age属性

 xiaoming.age; // 18

 delete xiaoming.age; // 删除age属性

 xiaoming.age; // undefined

 \- 'name' in xiaoming; // true

 这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:
 'grade' in xiaoming; // false

 \- 要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:

 var xiaoming = {
   name: '小明'
 };

 xiaoming.hasOwnProperty('name'); // true

 xiaoming.hasOwnProperty('toString'); // false

 \- null、undefined、0、NaN和空字符串''视为false,其他值一概视为true


 \- for in
 \- 
   var a = ['A', 'B', 'C'];
   for (var i in a) {

   console.log(i); // '0', '1', '2'

   console.log(a[i]); // 'A', 'B', 'C'
 }

 \- 普通
  var o = {
   name: 'Jack',

   age: 20,

   city: 'Beijing'
   };

   for (var key in o) {

   if (o.hasOwnProperty(key)) {
     console.log(key); // 'name', 'age', 'city'
   }
   }

map ES6标准

-

   var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
   m.get('Michael'); // 95
   m.set('Adam', 67); // 添加新的key-value
   m.has('Adam'); // 是否存在key 'Adam': true
   m.get('Adam'); // 67
   m.delete('Adam'); // 删除key 'Adam'
   m.get('Adam'); // undefined

多次对一个key放入value,后面的值会把前面的值冲掉

set ES6标准

- 在Set中,没有重复的key。
- 重复元素在Set中自动被过滤:
- 注意数字3和字符串'3'是不同的元素。
- 通过delete(key)方法可以删除元素:
## iterable ##

- Array、Map和Set都属于iterable类型。
-

 var a = ['A', 'B', 'C'];

   for (var x of a) { // 遍历Array
   console.log(x);
   }
 \- for each
 \- 

   var a = ['A', 'B', 'C'];
   a.forEach(function (element) {
   console.log(element);
   });
 \- 

函数

箭头函数

其本身就是匿名函数,没有函数名

// 无参数:
() => 3.14

只有一个内容行,就不需要写{}花括号

x => x * x

有一个以上参数,就要加()和{}

(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

// SyntaxError:
x => { foo: x }

因为和函数体的{ ... }有语法冲突,所以要改为:

// ok:
x => ({ foo: x })

不能作为构造函数,不能使用new

箭头函数不绑定arguments,取而代之用rest参数...解决

let C = (...c) => {
  console.log(c);
}
C(3,82,32,11323);  // [3, 82, 32, 11323]

箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值

箭头函数没有原型属性

箭头函数不能当做Generator函数,不能使用yield关键字

匿名函数

- 如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined。

  var abs = function (x) {
   if (x >= 0) {
     return x;
   } else {
     return -x;
   }
   };

function (x) { ... }是一个匿名函数,它没有函数名。但是,这个匿名函数赋值给了变量abs
## arguments ##
- arguments.length
- arguments[0]
- arguments类似Array但它不是一个Array
- 即使函数不定义任何参数,还是可以拿到参数的值

变量

- 由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行
- 全局变量会绑定到window上
### 块级作用域的变量 ###

let

-
'use strict';

function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
}
// SyntaxError:
i += 1;
}

-const ##ES6

-
全部大写的变量

const PI = 3.14;
PI = 3; // 某些浏览器不报错,但是无效果!
### 名字空间 ###

全局变量

-
// 唯一的全局变量MYAPP:
var MYAPP = {};

// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;

// 其他函数:
MYAPP.foo = function () {
return 'foo';
};

重复声明定义(动态类型)

<script>
var x;               // 现在 x 是 undefined
var x = 7;           // 现在 x 是数值
var x = "Bill";      // 现在 x 是字符串值

document.getElementById("demo").innerHTML = x;//Bill
</script>

赋值后在声明,没用,不会改成define

<script>
var x = 7;  
var x; //赋值后在声明,没用,不会改成define
document.getElementById("demo").innerHTML = x;//7
</script>

null

在 JavaScript 中,null 的数据类型是对象。

设置值为 null 清空对象

null === undefined            // false
null == undefined             // true

typeof

typeof {name:'Bill', age:62} // 返回 "object"

typeof [1,2,3,4]             // 返回 "object" (在 JavaScript 中数组即对象)

typeof null                  // 返回 "object"

typeof function myFunc(){}   // 返回 "function"

解构赋值 ES6

-
'use strict';

var person = {
name: '小明',
age: 20,
gender: 'male',
passport: 'G-12345678',
school: 'No.4 middle school'
};
var {name, age, passport} = person;
console.log('name = ' + name + ', age = ' + age + ', passport = ' + passport);

- 变量已经被声明了,再次赋值的时候,正确的写法也会报语法错误:
-
// 声明变量:
var x, y;
// 解构赋值:
{x, y} = { name: '小明', x: 100, y: 200};
- 交换
-
var x=1, y=2;
[x, y] = [y, x]

详见 https://www.liaoxuefeng.com/wiki/1022910821149312/1023021187855808

常见的 HTML 事件

事件 描述
onchange HTML 元素已被改变
onclick 用户点击了 HTML 元素
onmouseover 用户把鼠标移动到 HTML 元素上
onmouseout 用户把鼠标移开 HTML 元素
onkeydown 用户按下键盘按键
onload 浏览器已经完成页面加载

innerhtml

   <script>
   document.getElementById("demo").innerHTML = 5 + 6;// 会覆盖之前html元素的内容
   </script>
<button onclick="this.innerHTML=Date()">现在的时间是?</button>//改自己按钮的元素

document.write()

在 HTML 文档完全加载后使用 document.write() 将删除所有已有的 HTML

对象

对象也是变量

var car = {type:"porsche", model:"911", color:"white"};//值以  名称:值   ,名称:值对被称为属性
// 创建对象:
var person = {
    firstName: "Bill",
    lastName : "Gates",
    id       : 12345,
    fullName : function() {
       return this.firstName + " " + this.lastName;
    }
};

引用对象的非函数属性,可以用objectName.propertyName;

函数属性,用objectName.methodName(),也就是加个“()”

比较==&===

请注意 (x==y) 与 (x===y) 的区别。

JavaScript 对象无法进行对比,比较两个 JavaScript 将始终返回 false。

不把字符串、数值和布尔值声明为对象

如:

var x = new String();        // 把 x 声明为 String 对象
var y = new Number();        // 把 y 声明为 Number 对象
var z = new Boolean();       //    把 z 声明为 Boolean 对象

他们会增加代码的复杂性并降低执行速度

字符串

字符串长度

内建属性 length 可返回字符串的长度

script中字符串换行

写两个script,写成如下可能不换行,不保险:

document.getElementById("demo").innerHTML = "Hello \
Kitty!";

某些浏览器也不允许 \ 字符之后的空格,保险做法:

document.getElementById("demo").innerHTML = "Hello" + 
"Kitty!";

下标访问

它让字符串看起来像是数组(其实并不是)

如果找不到字符,[ ] 返回 undefined,而 charAt() 返回空字符串。

它是只读的。str[0] = "A" 不会产生错误(但也不会工作!)

转换为数组

var txt = "Hello";       // 字符串
txt.split("");           // 分隔为字符

字符串是数字的比较

"2" < "12" false
"2" > "12" true

Boolean

var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true;    //输出 true

在 Boolean 表达式中,所有对象都会被自动转换为 true,所以 oFalseObject 的值是 true

Boolean 对象将覆盖 Object 对象的 ValueOf() 方法,返回原始值,即 true 和 false。ToString() 方法也会被覆盖,返回字符串 "true" 或 "false"。 oFalseObject.valueOf () 就可以了

false: 0、-0、null、""、false、undefined、NAN

true:其余都是

方法

for each

<body>
<p id="demo"></p>

<script>
    var txt="";
    var nums = ['f','ad','ad'];
    nums.forEach(shuchu);
    document.getElementById("demo").innerHTML = txt;

    function shuchu(value,index,array){
        txt += value + "<br/>";
    }

</script>
</body>

输出:
f
ad
ad

随机整数

Math.floor(Math.random() * 10);        // 返回 0 至 9 之间的数

Math.floor(Math.random() * 11);        // 返回 0 至 10 之间的数

适当的整数

//介于 min(包括)和 max(不包括)之间的随机数:
function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min) ) + min;
}

//介于 min 和 max(都包括)之间的随机数
function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min + 1) ) + min;
}

跳出

有标签的

var  cars = ["BMW", "Volvo", "Saab", "Ford"];
list: {
    text += cars[0] + "<br>"; 
    text += cars[1] + "<br>"; 
    text += cars[2] + "<br>"; 
    break list;
    text += cars[3] + "<br>"; 
    text += cars[4] + "<br>"; 
    text += cars[5] + "<br>"; 
}

//如果有标签引用,则 break 语句可用于跳出任意代码块:

练习

输入字符串并排序

 <form *name*="theForm">
​    <input *type*="text" *name*="newName" *size*="20">
​    <input *type*="button" *name*="add" *value*="add" *onclick*="**SortNames**()">
​    <textarea *cols*="60" *rows*="10" *name*="sorted">the sorts</textarea>
  </form>
  ------------------------------------------------------
var newName = 0;
var names = [];
function SortNames() {
    theName = document.theForm.newName.value;
    names[newName] = theName;
    newName++;
    names.sort();
    document.theForm.sorted.value = names.join("\n");
    console.log(names, "ss")
}

image-20210530171333971

prototype

function addHead(level) {
    title = "h" + level;
    text = this.toString();
    start = "<" + title + ">";
    end = "</" + title + ">";
    return start + text + end;
}
String.prototype.heading = addHead;//为string增加一个方法
document.write("this is one".heading(1));
document.write("this is two".heading(2));
document.write("this is three".heading(3));

for in 循环

function Card(a, b) {
    this.a = a;
    this.b = b;
}
var tom = new Card("tom", "1231");
for (i in tom) {
    console.log(i + ":" + tom[i]);
}
//a:tom
//b:1231
全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
在看牛客的社畜很积极:身高体重那一行信息去掉,学校那一行的信息放上面,找半天都没找到你是哪个学校什么专业的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务