小知识随手记(五)
1、函数内部属性
函数内部,有两个特殊的对象:arguments 和 this。
arguments 是一个类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数。但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
对于阶乘函数一般要用到递归算法,所以函数内部一定会调用自身;如果函数名不改变是没有问题的,但一旦改变函数名,内部的自身调用需要逐一修改。为了解决这个问题,我们可以使用 arguments.callee 来代替实现递归。
function box(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);//使用 callee 来执行自身
}
}
3、JS保留小数点后位数:
(1)toFixed():里面的参数就是保留小数的位数。返回结果为一个String类型
var num=22.127456;
alert( num.toFixed(2));//22.13,四舍五入
toFixed自带补位功能
var num = 55.3;
console.log(num.toFixed(2));//55.30
(2)round()方法可把一个数字舍入为最接近的整数。无补位功能
var num=22.127456;
alert( Math.round(num*100)/100);
上面的方法有四舍五入的功能,但没有补位的功能,可以通过以下方式实现
var num1 = parseFloat(55);
if (!isNaN(num1)) {
num1 = Math.round(num1*100)/100;
var str = num1.toString();
var rs = str.indexOf('.');
if (rs < 0) {
rs = str.length;
str += '.';
}
while (str.length <= rs + 2) {
str += '0';
}
console.log("将浮点数四舍五入,取小数点后2位,位数不够进行补位:");
console.log(str);
}
(3)substr直接按字符串截取:这种方式没有四舍五入的功能,直接按位截取的,也没有补位功能
var num1 = 55.3785 + "";
console.log("substr方式保留两位小数:");
console.log(num1.substr(0,num1.indexOf(".")+3));//55.37
4、jQuery获取父窗口里的元素:
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById("父窗口元素ID");
$('body',window.parent.document).height();
//获取父窗口body高度
5、select根据某个值动态选中
(1)注意下面此种需要option里有加value属性才可以,当然不止value属性,随便加个属性,均可通过此种方式获取
<select id="select_id" >
<option value="0" >请选择</option>
<option value="1">苏宁易购</option>
<option value="2">天猫旗舰店</option>
</select>
$("#select_id option[value='1']").removeAttr("selected");//根据值去除选中状态
$("#select_id option[value='"+ soft.id +"']").attr("selected","selected");//根据值让option选中
6、获取一组radio被选中项的值
$('input[name="abc"]:checked')//选中
$('input:radio:checked').val()//选中
$('input[name="abc"]').filter(":checked").val()//选中
$('input[name="abc"]:eq(1)').val()//某个特定
$('input[name="abc"]').eq(1).val()//某个特定
$('input[name="abc"]').each(function(){//每一个
alert(this.value);
})
7、(1)为什么我的vertical-align属性不起作用?vertical-align,称之为“inline-block依赖型元素",只有一个元素属于inline或是inline-block水平,其身上的vertical-align属性才会起作用。所谓inline-block水平的元素,就是既可以与inline水平元素混排,又能设置高宽属性的元素。哪些元素呢,例如图片,按钮,单复选框,单行/多行文本框等HTML控件,只有这些元素默认情况下会对vertical-align属性起作用。
(2)vertical-align的属性:
text-bottom是与父标签的文字底部对齐,而bottom是相对于父标签的底部对齐(一个是内容区底部,一个是标签区底部)
8、jquery实现手机验证码发送倒计时60s
<!DOCTYPE html>
<html>
<head>
<script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
var countdown=60;
function settime(obj) {
if (countdown == 0) {
obj.removeAttribute("disabled");
obj.value="免费获取验证码";
countdown = 60;
return;
} else {
obj.setAttribute("disabled", true);
obj.value="重新发送(" + countdown + ")";
countdown--;
}
setTimeout(function() {
settime(obj)
},1000)
}
</script>
<body>
<input type="button" id="btn" value="免费获取验证码" onclick="settime(this)" />
</body>
</html>
9、【回归基础】JavaScript 函数中默认参数:
默认参数允许你设置参数的默认值。默认情况下,JavaScript 函数的所有参数都是 undefined (未定义的)。默认参数允许你设置不同的默认值。请考虑以下示例:
function logFirst(data){
console.log(data[0]);
}
这个例子是说,我们有一个简单的函数,打印数组中的第一个元素。该函数需要一个参数,data
,我们期望它是一个 Array 数组。但是如果没有数据传入,会发生什么?
logFirst();
// Uncaught TypeError: Cannot read property '0' of undefined
// 未捕获的输入错误:无法读取 undefined 的 '0' 属性
我们收到一个错误。 因为 data
未被传递到我们的函数中,因此被默认为 undefined (未定义的)。
我们如何解决这个问题? 你可以使用默认参数。 要使用默认参数,只需传递 (parameter = defaultValue)
。 这里我们将参数的默认值设置为 ['cats']
数组。
function logFirst(data = ['cats']){
console.log(data[0]);
}
logFirst();//cats
现在当我们运行没有任何传入的函数时,data
的值将默认为数组 ['cats']
:它返回默认值 cats
!最重要的是,如果我们提供一个参数,它将覆盖默认值:
logFirst(['dogs']);
// dogs
还可以在单个函数中拥有多个默认参数:
function logFirst(num = 0, data = ['cats']){
console.log(`I own ${num} ${data[0]}.`);
}
logFirst();
// I own 0 cats.
logFirst(2);
// I own 2 cats.
logFirst(undefined,['dogs']);
// I own 0 dogs.
PS:你如果不是用ES6语法,默认参数可以这样写:var num = num || 1 ;
function logNum(num){
var num = num || 1 ; // 当参数 num 为 false 时,重新赋值 num
console.log( "默认参数 num : " + num );
}
logNum();
// 默认参数 num : 1
这里第2行的意思是,当参数 num
为 false
时,重新赋值 num
为 1
。
10、checkbox不选中传值,checkbox设置默认值
最近在使用form表单时,出现了一个问题,checkbox如果选中会传true,没选中就什么都不传,但是这不是想要的效果呀,希望做到选中时传true,不选中时传false。
html checkbox元素只能设置一个value,当我们没有选中的时候取不到其默认值,也就不会传给后台。
于是在checkbox元素上面增加一个隐藏域,当我们checkbox选中时就利用 js 去改变其默认值,不选则不改变。
<input type="hidden" id="history" name="isHistoryTime" value="false">
<input type="checkbox" onclick="javascript:document.getElementById('history').value=this.checked;"></p>