javascript的基本语法 var 声明变量 变量是对“值”的具名 先声明变量a ,然后在变量a 与数值1之间建立引用关系,称为将数值1“赋值”给变量a 。以后,引用变量名a 就会得到数值1。最前面的var ,是变量声明命令。它表示通知解释引擎,要创建一个变量a 。 var a=1; 变量的声明和赋值是两个分开的步骤 var a; a = 1; 不写 var 的做法,不利于表达意图,容易创建全局变量要使用var javascript 动态语言类型语言 类型没有限制 var a=1; a = ‘hello’; a先被赋值又被重新赋值字符串 变量a已经存在 var x = 1; var x; 变量声明两次,第二次声明无效 二次声明时候进行赋值会覆盖掉前面的值 var x = 1; var x = 2; x =2 ; 变量提升 javasp工作方式先解析代码在一行一行运行 var a; console.log(a); a=1 结果变量a没有声明和赋值 标识符
- 第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号(
$ )和下划线(_ )。 - 第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字
0-9 。
下面这些都是合法的标识符。 注释、 //单行注释 /多行注释/符号/**/ JavaScript 可以兼容 HTML 代码的注释,所以<!-- 和--> 也被视为合法的单行注释。 x=1;
x=3; –>在行首被当成单行注释 function countdown(n) { while (n --> 0) console.log(n); } countdown(3) // 2 // 1 // 0 只有–>在行首才能被注释 avaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
对于var 命令来说,JavaScript 的区块不构成单独的作用域(scope)。
{
var a = 1;
}
a
上面代码在区块内部,使用`var`命令声明并赋值了变量`a`,然后在区块外部,变量`a`依然有效,区块对于`var`命令不构成单独的作用域,与不使用区块的情况没有任何区别。在 JavaScript 语言中,单独使用区块并不常见,区块往往用来构成其他更复杂的语法结构,比如`for`、`if`、`while`、`function`等。
条件语句
if(布尔值)
;
if ;
if (m === 3) {
} else {
}
`else`代码块总是与离自己最近的那个`if`语句配对
if (m !== 1) {
if (n === 2) {
console.log('hello');
} else {
console.log('world');
}
}
如果想让`else`代码块跟随最上面的那个`if`语句,就要改变大括号的位置。
if (m !== 1) {
if (n === 2) {
console.log('hello');
}
} else {
console.log('world');
}
JavaScript 还有一个三元运算符(即该运算符需要三个运算子)`?:`,也可以用于逻辑判断。
(条件) ? 表达式1 : 表达式2
上面代码中,如果“条件”为true ,则返回“表达式1”的值,否则返回“表达式2”的值。 JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。 windows对象指当前网页窗口 window.frames 属性返回一个类似数组的对象,成员为页面内所有框架窗口,包括frame 元素和iframe 元素。window.frames[0] 表示页面中第一个框架窗口。 window.name 是一个字符串,表示当前浏览器窗口的名字 这个属性主要配合超链接和target属性使用window.name = ‘Hello World!’; console.log(window.name) // “Hello World!” 该属性只能保存字符串,如果写入的值不是字符串,会自动转成字符串。各个浏览器对这个值的储存容量有所不同,但是一般来说,可以高达几MB。
只要浏览器窗口不关闭,这个属性是不会消失的。举例来说,访问a.com 时,该页面的脚本设置了window.name ,接下来在同一个窗口里面载入了b.com ,新页面的脚本可以读到上一个网页设置的window.name 。页面刷新也是这种情况。一旦浏览器窗口关闭后,该属性保存的值就会消失,因为这时窗口已经不存在了。 window.frames,window.length windows.frames 属性返回一个类似数组的对象 对象为页面所有的框架口 window.frames[0] 表示页面中第一个框架窗口。包括frame 元素和iframe 元素 如果iframe元素设置id或name 属性,那么就可以用属性值,引用这个iframe 窗口。比如<iframe name="myIFrame"> 可以用frames['myIFrame'] 或者frames.myIFrame 来引用。 window.length属性返回当前网页包含的框架总数。如果当前网页不包含 frame和 iframe元素,那么 window.length就返回 0`。
window.frames.length === window.length
``
### window.top,window.parent
`window.top`属性指向最顶层窗口,主要用于在框架窗口(frame)里面获取顶层窗口。
`window.parent`属性指向父窗口。如果当前窗口没有父窗口,`window.parent`指向自身。
windows.alert 弹出对话框只有一个确定按钮
window.alert(hello world')
windows.alert()方法参数只能是字符串,没法采用css样式可用\n指定换行
alert('本条提示\n’);
2)window.prompt()**
`window.prompt()`方法弹出的对话框,提示文字的下方,还有一个输入框,要求用户输入信息,并有“确定”和“取消”两个按钮。它往往用来获取用户输入的数据
var result = prompt('s',25)
window.prompt()`的返回值有两种情况,可能是字符串(有可能是空字符串),也有可能是`null`。具体分成三种情况。
1. 用户输入信息,并点击“确定”,则用户输入的信息就是返回值。
2. 用户没有输入信息,直接点击“确定”,则输入框的默认值就是返回值。
3. 用户点击了“取消”(或者按了 ESC 按钮),则返回值是`null`。
window.confirm(1)
window.alert(1)
window.prompt(1)
****location**** 对象
`Location`对象是浏览器提供的原生对象,提供 URL 相关的信息和操作方法。通过`window.location`和`document.location`属性,可以拿到这个对象
- `Location.href`:整个 URL。
- `Location.protocol`:当前 URL 的协议,包括冒号(`:`)。
- `Location.host`:主机。如果端口不是协议默认的`80`和`433`,则还会包括冒号(`:`)和端口。
- `Location.hostname`:主机名,不包括端口。
- `Location.port`:端口号。
- `Location.pathname`:URL 的路径部分,从根路径`/`开始。
- `Location.search`:查询字符串部分,从问号`?`开始。
- `Location.hash`:片段字符串部分,从`#`开始。
- `Location.username`:域名前面的用户名。
- `Location.password`:域名前面的密码。
// 跳转到新网址
document.location.href = 'http://www.example.com';
直接改写`location`,相当于写入`href`属性
## URLSearchParams 对象
### 概述
`URLSearchParams`对象是浏览器的原生对象,用来构造、解析和处理 URL 的查询字符串(即 URL 问号后面的部分)。
它本身也是一个构造函数,可以生成实例。参数可以为查询字符串,起首的问号`?`有没有都行,也可以是对应查询字符串的数组或对象。
```javascript
var params = new URLSearchParams('?foo=1&bar=2');
var params = new URLSearchParams(document.location.search);
var params = new URLSearchParams([['foo', 1], ['bar', 2]]);
var params = new URLSearchParams({'foo' : 1 , 'bar' : 2});
URLSearchParams 会对查询字符串自动编码。
var params = new URLSearchParams({'foo': '你好'});
params.toString()
上面代码中,foo 的值是汉字,URLSearchParams 对其自动进行 URL 编码。
浏览器向服务器发送表单数据时,可以直接使用URLSearchParams 实例作为表单数据。
const params = new URLSearchParams({foo: 1, bar: 2});
fetch('https://example.com/api', {
method: 'POST',
body: params
}).then(...)
上面代码中,fetch 命令向服务器发送命令时,可以直接使用URLSearchParams 实例。
URLSearchParams 可以与URL() 接口结合使用。
var url = new URL(window.location);
var foo = url.searchParams.get('foo') || 'somedefault';
上面代码中,URL 实例的searchParams 属性就是一个URLSearchParams 实例,所以可以使用URLSearchParams 接口的get 方法。
URLSearchParams 实例有遍历器接口,可以用for...of 循环遍历(详见《ES6 标准入门》的《Iterator》一章)。
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
for (var p of params) {
console.log(p[0] + ': ' + p[1]);
}
URLSearchParams 没有实例属性,只有实例方法。
URLSearchParams.toString()
toString 方法返回实例的字符串形式。
var url = new URL('https://example.com?foo=1&bar=2');
var params = new URLSearchParams(url.search);
params.toString()
那么需要字符串的场合,会自动调用toString 方法。
var params = new URLSearchParams({version: 2.0});
window.location.href = location.pathname + '?' + params;
上面代码中,location.href 赋值时,可以直接使用params 对象。这时就会自动调用toString 方法。
URLSearchParams.append()
append() 方法用来追加一个查询参数。它接受两个参数,第一个为键名,第二个为键值,没有返回值。
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.append('baz', 3);
params.toString()
append() 方法不会识别是否键名已经存在。
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.append('foo', 3);
params.toString()
上面代码中,查询字符串里面foo 已经存在了,但是append 依然会追加一个同名键。
URLSearchParams.delete()
delete() 方法用来删除指定的查询参数。它接受键名作为参数。
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.delete('bar');
params.toString()
URLSearchParams.has()
has() 方法返回一个布尔值,表示查询字符串是否包含指定的键名。
var params = new URLSearchParams({'foo': 1 , 'bar': 2});
params.has('bar')
params.has('baz')
URLSearchParams.set()
set() 方法用来设置查询字符串的键值。
它接受两个参数,第一个是键名,第二个是键值。如果是已经存在的键,键值会被改写,否则会被追加。
var params = new URLSearchParams('?foo=1');
params.set('foo', 2);
params.toString()
params.set('bar', 3);
params.toString()
上面代码中,foo 是已经存在的键,bar 是还不存在的键。
如果有多个的同名键,set 会移除现存所有的键。
var params = new URLSearchParams('?foo=1&foo=2');
params.set('foo', 3);
params.toString()
下面是一个替换当前 URL 的例子。
var params = new URLSearchParams(location.search.slice(1));
params.set('version', '2.0');
window.history.replaceState({}, '', location.pathname + `?` + params);
URLSearchParams.get(),URLSearchParams.getAll()
get() 方法用来读取查询字符串里面的指定键。它接受键名作为参数。
var params = new URLSearchParams('?foo=1');
params.get('foo')
params.get('bar')
两个地方需要注意。第一,它返回的是字符串,如果原始值是数值,需要转一下类型;第二,如果指定的键名不存在,返回值是null 。
如果有多个的同名键,get 返回位置最前面的那个键值。
var params = new URLSearchParams('?foo=3&foo=2&foo=1');
params.get('foo')
上面代码中,查询字符串有三个foo 键,get 方法返回最前面的键值3 。
getAll() 方法返回一个数组,成员是指定键的所有键值。它接受键名作为参数。
var params = new URLSearchParams('?foo=1&foo=2');
params.getAll('foo')
上面代码中,查询字符串有两个foo 键,getAll 返回的数组就有两个成员。
URLSearchParams.sort()
sort() 方法对查询字符串里面的键进行排序,规则是按照 Unicode 码点从小到大排列。
该方法没有返回值,或者说返回值是undefined 。
var params = new URLSearchParams('c=4&a=2&b=3&a=1');
params.sort();
params.toString()
上面代码中,如果有两个同名的键a ,它们之间不会排序,而是保留原始的顺序。
URLSearchParams.keys(),URLSearchParams.values(),URLSearchParams.entries()
这三个方法都返回一个遍历器对象,供for...of 循环遍历。它们的区别在于,keys 方法返回的是键名的遍历器,values 方法返回的是键值的遍历器,entries 返回的是键值对的遍历器。
var params = new URLSearchParams('a=1&b=2');
for(var p of params.keys()) {
console.log(p);
}
for(var p of params.values()) {
console.log(p);
}
for(var p of params.entries()) {
console.log(p);
}
如果直接对URLSearchParams 进行遍历,其实内部调用的就是entries 接口。 for (var p of params) {} // 等同于 for (var p of params.entries()) {}
URL 接口
浏览器原生提供URL() 接口,它是一个构造函数,用来构造、解析和编码 URL。一般情况下,通过window.URL 可以拿到这个构造函数。
构造函数
URL() 作为构造函数,可以生成 URL 实例。它接受一个表示 URL 的字符串作为参数。如果参数不是合法的 URL,会报错。
var url = new URL('http://www.example.com/index.html');
url.href
``
上面示例生成了一个 URL 实例,用来代表指定的网址。
除了字符串,`URL()`的参数也可以是另一个 URL 实例。这时,`URL()`会自动读取该实例的`href`属性,作为实际参数。
如果 URL 字符串是一个相对路径,那么需要表示绝对路径的第二个参数,作为计算基准。
```javascript
var url1 = new URL('index.html', 'http://example.com');
url1.href
var url2 = new URL('page2.html', 'http://example.com/page1.html');
url2.href
var url3 = new URL('..', 'http://example.com/a/b.html')
url3.href
上面代码中,返回的 URL 实例的路径都是在第二个参数的基础上,切换到第一个参数得到的。最后一个例子里面,第一个参数是.. ,表示上层路径。
实例属性
URL 实例的属性与Location 对象的属性基本一致,返回当前 URL 的信息。
- URL.href:返回整个 URL
- URL.protocol:返回协议,以冒号
: 结尾 - URL.hostname:返回域名
- URL.host:返回域名与端口,包含
: 号,默认的80和443端口会省略 - URL.port:返回端口
- URL.origin:返回协议、域名和端口
- URL.pathname:返回路径,以斜杠
/ 开头 - URL.search:返回查询字符串,以问号
? 开头 - URL.searchParams:返回一个
URLSearchParams 实例,该属性是Location 对象没有的 - URL.hash:返回片段识别符,以井号
# 开头 - URL.password:返回域名前面的密码
- URL.username:返回域名前面的用户名
var url = new URL('http://user:passwd@www.example.com:4097/path/a.html?x=111#part1');
url.href
url.protocol
url.hostname
url.host
url.port
url.origin
url.pathname
url.search
url.searchParams
url.hash
url.password
url.username
这些属性里面,只有origin 属性是只读的,其他属性都可写,并且会立即生效。
var url = new URL('http://example.com/index.html#part1');
url.pathname = 'index2.html';
url.href
url.hash = '#part2';
url.href
上面代码中,改变 URL 实例的pathname 属性和hash 属性,都会实时反映在 URL 实例当中。
|